第23章 HTTP服務和APACHE

更多內容請點擊:

Linux學習從入門到打死也不放棄,完全筆記整理(持續更新,求收藏,求點贊~~~~) 

http://blog.51cto.com/13683480/2095439


第23章  HTTP服務和APACHE

 

本章內容:

               socket套接字基礎

               http協議介紹

               httpd介紹

               httpd2.2相關配置

               httpd2.4特性

               編譯安裝httpd

                    

INTERNET介紹以及歷史:略

               

--------------------------------------------------------------------------------

Sockte:套接字:

               跨internet的主機間通訊:

               在建立通信連接的每一端,進程間的傳輸要有兩個標誌:

                             IP地址和端口號,合稱爲套接字地址 Socket  address

                             客戶機套接字地址定義了一個唯一的客戶進程

                             服務器套接字地址定義了一個唯一的服務器進程

               如:192.168.65.132 80

               

               socket:套接字,進程間通信(IPC)的一種實現,允許不同主機(或同一主機)上

                             不同進程之間進行通信和數據交換,socketAPI出現於1983年,4.2BSD實現

               socketAPI:

                             封裝了內核中所提供的socket通信相關的系統調用

               socket domain:根據其所使用的地址

                            AF_INET:       Address Family IPv4

                            AF_INET6:      IPv6

                            AF_UNIX: 同一主機上不同進程之間通信時使用

               Socket type:根據使用的傳輸層協議

                            SOCK_STREAM:     流,tcp套接字,可靠的傳遞,面向連接

                            SOCK_DGRAM:            數據報,udp套接字,不可靠的傳遞,無連接

                             SOCK_RAW:        裸套接字,無須tcp或udp,APP直接通過IP包通信

                             

               套接字相關的系統調用:

                            socket():  創建一個套接字

                            bind():            綁定IP和端口

                             listen():    監聽

                            accept():  接收請求

                            connect():       請求連接建立

                            write():    發送

                            read():            接收

                            close():    關閉

                             

socket通信示例:

1      準備腳本:

 

服務器端tcpserver.py

vim tcpserver.py

#!/usr/bin/python

import socket

HOST='0.0.0.0'

PORT=9090

BUFFER=4096

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.bind((HOST,PORT))

sock.listen(3)

print('tcpserver listen at: %s:%s\n\r'  %(HOST,PORT))

while True:

         client_sock,client_addr=sock.accept()

         print('%s:%s connect' %client_addr)

         while True:

                 recv=client_sock.recv(BUFFER)

                if not  recv:

                         client_sock.close()

                         break

                print('[Client %s:%s said]:%s'  %(client_addr[0],client_addr[1],recv))

                 client_sock.send('tcpServer  has received your message')

sock.close()

 

                             

客戶端tcpclient.py

vim tcpclinet.py

#!/usr/bin/python

import socket

HOST='192.168.65.132'

PORT=9090

BUFFER=4096

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.connect((HOST,PORT))

sock.send('hello,tcpServer!')

recv=sock.recv(BUFFER)

print('[tcpServer said]: %s' %  recv)

sock.close()          

                             

 

2      通信過程:

               服務器端(192.168.65.132) 開啓服務

                            python  tcpserver.py

               客戶端執行:python tcpclient.py

               

               

-----------------------------------------------------------------------------

HTTP協議:

               相關術語:

               http: Hyper text transfer protocol,80/tcp 超文本傳輸協議,

               html:  hyper text markup language  超文本標記語言,編程語言

                            示例:

                                           <html>

                                           <head>

                                                         <title> html語言</title>

                                           </head>

                                           <body>

                                           <h1>標題1</h1>

                                           <p><a href=http://www.magedu.com>馬哥教育</a>歡迎你</p>

                                           <h2>標題2</h2>

                                           </body>

                                           </html>

 

               CSS:      Cascading style sheet 層疊樣式表

               js: javascript

               MIME:   multipurpose internet mail extensions

                             多用途互聯網郵件擴展,/etc/mime.types

               

http協議介紹:

               http/0.9:

                             1991年,原型版本,功能簡陋,只有一個命令GET  /index.html,服務器只能迴應

                             HTML格式字符串,不能迴應別的格式

                             

               http/1.0:

                     1996年5月,支持cahce,MIME,method

                     1     每個tcp連接只能發送一個請求,發送數據完畢,連接就關閉,如果還要請求

                             其他資源,就必須再新建一個連接

                     2     引入了POST命令和HEAD命令

                     3     頭信息是ASCII碼,後面數據可以爲任意格式。服務器迴應時會告訴客戶端,數據

                            是什麼格式,即Content-Type字段的作用,這些數據類型總稱爲MIME,多用途互聯網

                             郵件擴展,每個值包括一級類型和二級類型,預定義的類型,也可以自定義類型

                     4     常見content-type值:text/xml,image/jpeg,audio/,mp3

               

               http/1.1:

                     1997年1月

                     1     引入了持久連接(persistent  connection),即tcp連接默認不關閉,可以被多個

                             請求複用,不用生命connection:keep-alive。對於同一個域名,大多瀏覽器允許

                            同時建立6個持久連接

                     2     引入了管道機制(pipelining),即在同一個tcp連接裏,客戶端可以同時發送多個

                             請求,進一步改進了http協議的效率

                     3     新增方法:     PUT,PATCH,OPTIONS,DELETE

                     4     同一個tcp連接裏面,所有的數據通信時按次序進行的。服務器只能順序處理迴應,

                             前面的迴應慢,會有許多請求排隊,造成"對頭堵塞"(head-of-line blocking)

                     5      爲避免上述問題,有兩種方法:一是減少請求數,二是同時多開持久連接。

                             網頁優化技巧:比如合併腳本和樣式表,將圖片嵌入css代碼,域名分片(domain sharding)  

                     6      http協議不帶有狀態,每次請求都必須附上所有信息。請求的很多字段都是重複的

                             浪費帶寬,影響速度。

               

               sady:2009年,谷歌研發,解決HTTP/1.1效率不高問題

               http/2.0:  2015年

                     1     頭信息和數據體都是二進制,稱爲頭信息幀和數據幀

                     2     複用tcp連接,在一個連接裏,客戶端和瀏覽器都可以同時發送多個請求或迴應,

                            且不用按順序--對應,避免了“對頭堵塞”,此雙向的實時通信稱爲多工(multiplexing)

                     3     引入頭信息壓縮機制(header  compression),頭信息使用gzip或compress

                             壓縮後再發送;客戶端和服務器同時維護一個頭信息表,所有字段都會存入

                             這個表,生成一個索引號,不發送同樣字段,只發送索引號,提高速度

                     4      http/2.0允許服務器爲經請求,主動向客戶端發送資源,即服務器推送

                            (server push)

               

http工作機制:

               工作機制:

                            http請求:http request

                            http響應:http response

                            一次http事務:請求 <--> 響應

 

               web資源: web resource

                             一個網頁有多個資源構成,打開一個頁面,會有多個資源展示出來,但是每個

                             資源都要單獨請求。因此,一個web頁面,通常並不是單個資源,而是一組資源的

                            集合

 

               靜態文件:無需服務端做出額外處理

                            文件後綴:.jpg .html .txt .js .css .mp3 .avi

               動態文件:服務端執行程序,返回執行的結果

                            文件後綴:.asp .php .jsp

                             

               http連接方式和性能:

                             串行連接:建立連接(tcp握手)-http事務-斷開連接(tcp揮手)

                                            低效率,多個請求會順序執行                 

                             並行連接:通過多條tcp連接發起併發的http請求

                            持久連接:keep-alive,長連接,重用tcp連接,以消除連接和關閉的時延

                                            以事務個數和時間來決定是否關閉連接

                                            一次tcp連接過程可以處理多次請求,省去斷開之後重新建立連接的過程

                             管道化連接:通過共享tcp連接發起併發的http請求

                                            建立持久連接之後,並行處理髮起httpd事務

                             複用的連接:交替傳送請求和相應報文(實驗階段)

 

URL 介紹:

               URI: Uniform Resource Identifier 統一資源標識,分爲URL和URN

               

               URN: Uniform Resource Naming ,統一資源命名

                     示例:P2P下載使用的磁力鏈接是URN的一種實現

                             magnet:?xt=urn:btih:660557A6890EF888666

               

               URL:Uniform Resoruce  Locator

                      統一資源定位符,用於描述某服務器某特定資源位置

               

               兩者區別:URN如同一個人的名稱,而URL代表一個人的住址。換言之,URN定義某事物的身份,

                            而URL提供查找該事物的方法,URN僅用於命名,而不指定地址

                             

               URL 組成:

                             <scheme>://<user>:<password>@<host>:<port>/path;<params>?<query>#<frag>

                            例如:

                                           http://user5:[email protected]/download/

                             

                            scheme:  方案,訪問服務器以獲取資源時要使用哪種協議

                            user:     用戶,某些方案訪問資源時需要的用戶名

                             password:密碼,用戶對應的密碼,中間用":"分隔

                            host:       主機,資源宿主服務器的主機名或IP地址

                            port:     端口,資源宿主服務器正在監聽的端口號,很多方案有默認端口號

                            path:     路徑,服務器資源的本地名,由一個"/"將其與前面

                            params:  參數,指定輸入的參數,參數爲名/值對,多個參數用";"分隔

                            query:  查詢,傳遞參數給程序,如數據庫,用"?"與前面分隔,多個查詢使用"&"分隔

                            frag:      片段,一小片或一部分資源的名字,此組件在客戶端使用,用#分隔

                             

                            示例:

        

網站訪問量:

               IP(獨立IP):即internet  protocol,指獨立IP數。一天內來自相同客戶機IP地址只

                                    計算一次,記錄遠程客戶機IP地址的計算機訪問網站的次數,是衡量網站

                                    流量的重要指標

               PV(訪問量):即Page  View,頁面瀏覽器或點擊量,用戶每次刷新即被計算一次,PV反映

                                    的是瀏覽某網站的頁面數,PV與來訪者的數量成正比,PV並不是頁面的來訪者

                                    數量,而是網站被訪問的頁面數量

               UV(獨立訪客):即Unique  Visitor,訪問網站的一臺電腦爲一個訪客,一天內相同的客戶端

                                    只被計算一次,可以理解成訪問某網站的電腦的數量,網站判斷來訪電腦的身份

                                    是通過來訪電腦的cookies實現的。如果更換了IP後但不清除cookies,再訪問

                                    相同網站,該網站的統計中UV數是不變的。

               網站統計:http://www.alexa.cn/rank

               

               QPS:       request per second      每秒請求數   

               PV,QPS,併發連接數換算公式

                             QPS=PV*(頁面衍生連接次數/統計時間(86400))

                            併發連接數=QPS*http 平均響應時間

               峯值時間:每天80%的訪問集中在20%的時間裏,這20%時間爲峯值時間

               峯值時間每秒請求數(QPS)=( 總PV數 *頁連接次數)*80% ) / ( 每天秒數* 20% )

               

 

http:一次完整的請求處理過程

               1     建立連接(TCP握手,ssl握手)

                             接收或拒絕連接請求

               

               2     接收請求:

                             接收客戶端請求報文中對某資源的一次請求的過程

                                    

                     web訪問相應模型(web I/O)

                            單進程I/O模型:

                                           啓動一個進程處理用戶請求,而且一次只處理一個,

                                           多個請求被串行相應

                            多進程I/O模型:

                                           並行啓動多個進程,每個進程相應一個連接請求

                            複用I/O結構:

                                           啓動一個進程,同時響應N個連接請求

                                           多線程模型:一個進程生成N個線程,每個線程相應一個連接請求

                                           事件驅動:event,一個進程處理N個請求

                            複用的多進程I/0模型:

                                           啓動M個進程,每個進程相應N個連接請求,同時接受M*N個請求

                                           

               3     處理請求:

                             服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,

                             根據方法,資源,首部和可選的主體部分對請求進行處理

                                    元數據:請求報文首部

                                    <method> <URL> <VERSION>

                                   HEADERS  格式 name:value

                                   <request  body>

                                    示例:

                                    Host:www.magedu.com          請求的主機名稱

                                    Server:Apache/2.4.7

                             

                             HTTP常用請求方式,method:

                                    GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS

                                    

               4     訪問資源:

                             服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,

                             負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源

                             

                             資源放置於本地文件系統特定的路徑:DocRoot

                                   SERVER  DOCROOT --> /var/www/html     

                                    /var/www/html/images/logo.jpg 訪問路徑即爲:

                                    http://SERVER/images/logo.jpg

                             

                             WEB服務器資源路徑的映射方式:

                                   (1)      docroot

                                   (2)      alias

                                   (3)      虛擬主機docroot

                                   (4)      用戶家目錄docroot

                                    

               5     構建相應報文:

                            一旦web服務器識別出了資源,就執行請求方法中描述的動作,並放回相應

                            報文。

                             相應報文中,包含有響應狀態碼,響應首部,如果生成了響應主體的話,

                            還包括響應主體

                             

                            響應主體:

                                           如果事務處理產生了響應主體,就將內容放在響應報文中回送過去,響應

                                           報文中通常包括:

                                           (1)描述了響應主體MIME類型的Content-type首部

                                           (2)描述了響應主體長度的content-length

                                           (3)實際報文的主體內容

                                           

                            URL重定向:

                                           web服務器構建的相應並非客戶端請求的資源,而是資源另外一個訪問路徑

                                           永久重定向:301

                                           臨時重定向:302

                                                  

                            MIME類型:

                                           web服務器要負責確定相應主體的MIME類型,多種配置服務器的方法

                                           可以將MIME類型與資源管理起來

                                           魔法分類:apache  web服務器可以掃描每個資源的內容,並將其與一個已知

                                                         模式表(被稱爲魔法文件)進行匹配,以決定每個文件的MIME類型,

                                                         這樣做可能比較慢,但很方便,尤其是文件沒有標準擴展名時。

                                           顯示分類:可以對web服務器進行配置,但其不考慮文件的擴展名或內容,強制

                                                         特定文件或目錄內容擁有某個MIME類型

                                           類型協商:有些web服務器經過配置,可以以多種文檔格式來存儲資源。在這種

                                                         情況下,可以配置web服務器,使其可以通過與用戶的協商來

                                                         決定使用哪種格式(及相關的MIME類型)“最好”

                                                         

               6     發送相應報文

                             web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。

                             服務器可能有很多條到各個客戶端的連接

                             有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送相應數據。

                             服務器要記錄連接的狀態,還要特別注意對持久連接的處理。

                             對非持久連接而言,服務器應該在發送了整條報文之後,關閉自己這一端的連接。

                             對持久連接來說,連接可能扔保持打開狀態,在這種情況下,服務器要正確地

                            計算content-length首部,不然客戶端就無法知道響應什麼時候結束了

                             

               7     記錄日誌:

                             最後,當事務結束時,web服務器會在日誌文件中添加一個條目,來描述

                            已執行的事務

                             

 

http服務器應用:

               http服務器程序:

                            httpd  apache

                             nginx

                             lighttpd

               應用程序服務器:

                            IIS  .asp

                            tomcat  .jsp

                            jetty       開源的servlet容器,基於jave的web容器

                            Resin  CAUCHO公司,支持sevlets和jsp的引擎

                             webshpere(IBM),weblogic(BEA,已被oracle收購),jboss,oc4j(oracle)

 

               市場佔有率統計:

                             www.netcraft.com

 

                             

------------------------------------------------------------------------------

httpd介紹:

               20世紀90年代初,美國國家超級計算機應用中心NSCA開發

               1995年開源社區發佈apache (a  patchy server)

               軟件基金會:ASF(apache software  foundation)

 

               特性:

                            高度模塊化:core + modules

                            DSO: Dynamic Shared Object 動態裝/卸載

                            MPM: multi-processing module 多路處理模塊

 

               功能特性

                            虛擬主機:

                                    基於IP,PORT,FQDN

                            CGI: Common Gateway  Interface,通用網關接口

                            反向代理

                            負載均衡

                            路徑別名

                             豐富的用戶認證機制

                                    basic

                                    digest

                            支持第三方模塊

               

MPM工作模式:

               prefork:

                            多進程I/O模型,每個進程相應一個請求,默認模型

                             一個主進程:生成和回收n個子進程,創建套接字,不相應請求

                             多個子進程:工作進程,每個子進程處理一個請求,系統開始時,預先生成

                                                  多個空閒進程,等待請求,最大不超過1024個

                                                  ulimit -a

               worker:

                            複用的多進程I/O模型,多進程多線程,IIS使用此模型

                            一個主進程:生成m個子進程,每個子進程負責生成n個線程,每個線程相應一個

                                                  請求,併發相應請求m*n

               event:

                            事件驅動模型(worker模型的變種)

                            一個主進程:生成m個子進程,每個進程直接相應n個請求,併發相應已請求m*n

                             有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求

                             傳遞給服務線程,執行完畢後,又允許釋放,這樣增強了高併發場景下的請求處理

                            能力

                             centos6默認使用httpd-2.2 event 爲測試版

                             centos7默認使用httpd-2.4 event 爲穩定版

 

                             

httpd安裝:

               安裝:

                     centos6 httpd-2.2  

                     centos7  httpd-2.4

               安裝方式:

                     rpm:centos發行版,穩定,建議使用

                     編譯:定製或特殊需求

                    

centos6   httpd程序環境:

               配置文件:

                             /etc/httpd/conf/httpd.conf

                             /etc/httpd/conf.d/*.conf

               檢查配置文件語法:

                            httpd -t  

                            service httpd  configtest

                             

               服務腳本:/etc/rc.d/init.d/httpd

                            腳本配置文件:/etc/sysconfig/httpd 主要用來配置MPM

               

               站點網頁文檔根目錄:

                             /var/www/html

               模塊文件路徑:

                             /etc/httpd/modules

                             /usr/lib64/httpd/modules

                             前者是後者的軟鏈接

                             

               主程序文件:

                             /usr/sbin/httpd

                             /usr/sbin/httpd.worker

                             /usr/sbin/httpd.event

                             

               主進程文件:

                             /etc/httpd/run/httpd.pid

                             開啓服務此文件自動生成,記錄主進程id號,關閉服務自動銷燬

                             

               日誌目錄文件:

                             /var/log/httpd/

                            /etc/httpd/log/  是前者的軟鏈接

                            access_log:     訪問日誌

                             error_log:錯誤日誌

                             

               幫助文檔包:

                             httpd-manual

                             

 

--------------------------------------------------------------------------------                    

httpd 2.2 常見配置:

               httpd 2.2 配置文件的組成

                            grep "Section"  /etc/httpd/conf/httpd.conf

                            ### Section 1:  Global Environment

                            ### Section 2:  'Main' server configuration

                            ### Section 3:  Virtual Hosts

                             

               配置格式:directive value   指令+值

                            directive:  不區分字符大小寫

                             value:爲路徑時,是否區分大小寫,取決於文件系統

                             

               1     修改監聽的IP和port

                            Listen  [IP:]PORT

                            省略IP表示爲本機所有IP

                            Listen  指令至少一個,可重複出現多次

                                          listen  80

                                          listen  9627

                                          listen  192.168.65.132:8080

                      注意:修改端口之後,必須重啓服務才能生效

                    

               2     持久連接:

                            Persistent  Connection:連接建立,每個資源獲取完成後不會斷開連接,而是

                             繼續等待其他請求完成,默認爲關閉。

                            斷開條件:

                                           數量限制:100     表示最多接受100個請求之後斷開

                                           時間限制:15        表示15秒之後斷開

                             副作用:對併發訪問量較大的服務器,持久連接功能會使有些請求得不到相應

                             折中方案:使用較短的持久連接時間

                     配置選項:

                            Keepalive  ON|OFF 默認OFF,如果爲off 下面兩項失效

                            keepalivetimeout  15

                            maxkeepaliverequests  100

                    

                     測試:    telnet WEB_SERVER_IP  PORT

                                   GET /URL  HTTP/1.1

                                    HOST:WEB_SERVER_IP

                                    

               3     MPM(Multi-processing module) 多路處理模塊

                            prefork,worker,event(實驗階段)

                             httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供

                             三個二進制程序文件,分別用於實現對不同MPM機制的支持

                            確認方法:

                                          ps aux  |grep httpd

                            默認爲/usr/sbin/httpd,即prefork模式

                             

                              查看靜態編譯的模塊列表:

                                          httpd  -t  httpd.worker -t

                             查看靜態編譯及動態裝載的模塊

                                          httpd  -M

                            動態模塊加載:

                                           不需要重啓服務

                                           只需要reload 就生效                                      

                            動態模塊路徑:

                                           /etc/httpd/modules ->  ../../usr/lib64/httpd/modules

                             

                     更換MPM模塊,即更換一個httpd程序

                            vim  /etc/sysconfig/httpd

                             HTTPD=/usr/sbin/httpd.worker

                            重啓服務生效

                             

                                    prefork的默認配置:

                                   <IfModule  prefork.c>

                                    StartServers      8            開機啓動多少進程

                                    MinSpareServers    5 最少保持多少空閒進程

                                    MaxSpareServers    20      最多保持多少空閒進程,超過就殺掉

                                    ServerLimit      256 最多進程數,最大20000

                                    MaxClients      256 最大併發

                                    MaxRequestsPerChild  4000  子進程最多能處理的請求數量。在處

                                           理MaxRequestsPerChild 個請求之後,子進程將會被父進程終止,這

                                           時候子進程佔用的內存就會釋放(爲0時永遠不釋放)

                                    </IfModule>           

                                           

                                    worker的默認配置:

                                   <IfModule  worker.c>

                                    StartServers    4         開機啓動的進程數

                                    MaxClients    300              最大用戶連接數

                                    MinSpareThreads    25     最小保持線程數

                                    MaxSpareThreads 75            最大保持線程

                                    ThreadsPerChild    25       每個進程開啓線程數

                                    MaxRequestsPerChild 0 無限制

                                    </IfModule>

                             

               4     DSO:Dynamic Shared Object

                     加載動態模塊配置:

                             /etc/httpd/conf/httpd.conf

                             配置指定實現模塊加載格式:

                                   LoadModule  <mod_name> <mod_path>

                             模塊文件路徑可使用相對路徑:

                                    相對於Serverroot (默認爲/etc/httpd)

                     示例:

                                   LoadModule  auth_basic_module modules/mod_auth_basic.so

                                    

               5     定義'main' server的文檔頁面路徑

                                   DocumentRoot  "/path"

                             

                     文檔路徑映射:

                                   documentroot  指向的路徑爲URL路徑的起始位置"/"

                                    

                     注意:selinux 和iptables的狀態

                    

               6     定義站點主頁面

                                    DirectoryIndex index.html index.html.var

                                    

               7     站點訪問控制:

                      可基於兩種類型的路徑對哪些些資源進行何種訪問控制

                     文件系統路徑

                                    基於目錄

                                   <directory  "/path">

                                    ...

                                    </directory>

                                    

                                    基於文件

                                   <file  "/path/file">

                                    ...

                                    </file>

                                    

                                    使用正則表達式

                                   <filematch  "PATTERN">

                                    ...

                                    </filematch>

                             

                     URL路徑

                                   <Location  "">

                                    ...

                                    </Location>

                                    

                                    <LocationMatch "">

                                    ...

                                    </LocationMatch>

                                    

               8     訪問控制機制:

                                    基於來源地址

                                    基於賬號

                    

                      <directory>中“基於源地址”  實現訪問控制

                            (1)options:後跟1個或多個以空白字符分隔的選項列表

                                    所有可用特性:Indexes Includes FollowSymLinks  SymLinksifOwnerMatch ExecCGI MultiViews

                                    在選項前+,-表示增加或者刪除指定選項

                                    

                                    常見選項:

                                           index:指明的url路徑下不存在與定義的主頁面資源相符的資源文件時

                                                     返回索引列表給用戶

                                                    

                                           followsymlinks:允許訪問符號鏈接文件所指向的源文件

                                           ALL:      全部允許

                                           none:    全部禁用

                                           

                            (2)AllowOverride

                                    與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由accessfilename指定)

                                    文件中,覆蓋之前的配置指令。

                                    只對<directory>語句有效

                                           allowoverride all     所有指令都有效

                                           allowoverride now       .htaccess  文件無效 大多情情況選這個即可

                                           allowoverride authconfig indexes       除了authconfig和indexes  的其他指令都無法生效

               

                            (3)order 和allow,deny

                                    放在directory,.htaccess中

                                    order:定義生效次序,寫在後面的表示默認法則

                                          order  allow,deny

                                          allow  from ..

                                           默認deny,在allow from  後面添加白名單

                                           

                                          order  deny,allow

                                          deny  from ..

                                           默認allow,在deny from  後面添加黑名單

                                           

                                    也可以:

                                          order  allow,deny

                                          allow  from 192.168.65

                                          deny  from 192.168.65.128

                                           用來控制範圍

                             

                                    客戶端地址:

                                           IP

                                           網絡:     172.16

                                                         172.16.0.0

                                                         172.16.0.0/16

                                                         172.16.0.0/255.255.0.0

                             

               9     日誌設定      

                     (1)   錯誤日誌:

                                           ErrorLog   logs/error_log

                            錯日誌記錄級別:

                                           loglevel warn (默認值)

                            可選loglevel:

                                           debug,info,notice,warn,error,crit,alert,emerg

                                           級別越低(左)記錄越詳細

                    

                     (2)訪問日誌      

                            定義日誌格式:

                                           LogFormat format strings

                            默認:LogFormat "%l %h %u %t \"%r\" %>s %b \"%{Referer}i\"  

                                    \"%{User-Agent}i\"" combined

                             

                            使用日誌格式:

                                           Customlog logs/access_log combined

 

                            參考幫助:

                                           http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

                            常用格式參數:

                                   %h   客戶端IP地址

                                   %l  遠程用戶,啓用mod_ident纔有效,通常爲空"-"

                                   %u   驗證(basic,digest)遠程用戶,非登錄訪問時,爲"-"

                                   %t    服務器收到請求時的時間

                                   %r   First line of  request,即表示請求報文的首行,記錄了此次請求

                                           的方法 URL 協議版本

                                   %>s  相應狀態碼

                                   %b   相應報文的大小,單位是字節;不包括響應報文http首部

                                   %{Referer}i      請求報文中首部referer的值;即從哪個頁面中的超鏈接跳轉

                                                                至當前頁面的

                                    %{User-Agent}i      請求報文中首部"User-Agent"的值;即發出請求的應用程序                

                             

                             修改日誌的時間格式:

                                   %{%F %T}t  

               

               

               10    顯示服務器版本信息:

                     對方瀏覽器打開頁面之後使用F12 可以看見服務器版本號

                                    ServerTokens:Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

                                   ServerTokens  Prod[uctOnly] :Server: Apache

                                   ServerTokens  Major: Server: Apache/2

                                   ServerTokens  Minor: Server: Apache/2.0

                                   ServerTokens  Min[imal]: Server: Apache/2.0.41

                                   ServerTokens  OS: Server: Apache/2.0.41 (Unix)

                                   ServerTokens  Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2  

                                    MyMod/1.2

                                   This setting  applies to the entire server and cannot be enabled or disabled on a  

                                    virtualhost-by-virtualhost   basis.

                                   After version  2.0.44, this directive also controls the information presented by the  

                                    ServerSignature directive.

                     建議使用:ServerTokens Prod    

 

               11    顯示默認字符集:

                            AddDefaultCharset  UTF-8

 

               12    定義路徑別名:

                            格式:    Alias /URL/ "/PATH/"  

                                           注意前後"/"必須一致,前面有,後面就必須有

                            Documentroot  "/data/www"

                                           http://www.wow.com/download/f1

                                          ==>  /data/www/download/f1

                                           

                            Alias /download/  "/app/dir1"

                                           http://www.wow.com/download/f1

                                          ==>  /app/dir1/f1

 

               13    基於用戶的訪問控制

                            認證質詢:WWW-Authenticate,響應碼爲401,拒絕客戶端請求,並說明要求客戶端

                                           提供賬號和密碼

                            認證:     Authorization,客戶端用戶填入賬號和密碼後再次發送請求報文,認證通過

                                           時,則服務器發送響應的資源

                            認證方式兩種:

                                           basic:明文

                                           digest:消息摘要認證,兼容性差

                             安全域:需要用戶認證後方能訪問的路徑,應該通過名稱對其進行標識,以便於告知用戶

                                           認證的原因

                             虛擬賬號:僅用於訪問某服務時用到的認證標識,區分於linux用戶賬號

                             賬號密碼存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等

                             

                     basic認證配置示例:

                            (1)定義安全域:

                                   <Directory  "/path">

                                           options none

                                           AllowOverride none

                                           AuthType basic

                                           AuthName "string"

                                           AuthUserFile "path/file"

                                           Require user username1 usename2...

                                    <directory>

                                    允許賬號文件中的所有用戶登錄訪問:

                                           Require valid-user

                                           

                            (2)提供賬號和密碼存儲,(文本文件方式)

                                    使用專用的命令完成此類文件的創建和用戶管理

                                                  htpasswd [options] /PATH/FILE username

                                    選項:

                                                  -c    自動創建文件,僅應該在文件不存在時使用,like  >

                                                  -p   明文密碼

                                                  -d   crypt格式加密,默認

                                                  -m md5格式加密

                                                  -s   sha格式加密

                                                  -D 刪除指定用戶

                    

                     基於組賬號進行認證:

                            (1)定義安全域

                                   <Directory  "/path">

                                           options none

                                           allowoverload none

                                            authtype basic

                                           authname "string"

                                           authuserfile "/path/file"

                                           authgroupfile "/path/groupfile"

                                           require group groupname1 groupname2 ...

                                    </Directory>

                             

                            (2)創建用戶賬號和組賬號文件

                                    組文件:每一行定義一個組

                                   groupname:  username1 username2 ...

                                    

                            注意:centos7定義require group 之後可以單獨定義 require user

                                     centos6定義require  group 之後再定義require user 會使group失效

                    

                     遠程客戶端和用戶驗證的控制

                            satisfy  All | Any

                                          All  客戶機IP和用戶驗證都需要通過纔可以

                                          Any  客戶機IP和用戶驗證,有一個滿足即可

                     示例:

                                   require  valid-user

                                   order  allow,deny

                                   allow from  192.168.1

                                   satisfy  any

                                    

                     注意:如果不加satisfy any 這一行,默認效果爲satisfy  all

                              即:全都需要滿足纔可以

               

               

               14    實現用戶家目錄的http共享

                                    基於模塊mod_userdir.so實現

                                    SElinux:http_enable_homedirs

                            相關設置:

                                   vim  /etc/httpd/conf/httpd.conf

                                   <ifmodule  mod_userdir.c>

                                           #userdir disabled

                                           userdir public_html   指定共享目錄的名稱

                                    </ifmodule>

                            準備目錄:

                                          su -  hello;mkdir ~/public_html

                                           setfacl -m u:apache:x ~hello

                            訪問:

                     不懂,待續。。。。 

                    

               

               15    ServerSignature ON | OFF |  Email

                             當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,缺省情況下由於打開了

                             ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、apache的版本

                            等信息

                            例如:

                                          Not  Found

 

                                          The  requested URL /dd was not found on this server.

                                           Apache/2.2.15 (CentOS) Server at 192.168.65.150 Port  80

                                                                

                             如果不對外顯示這些信息,就可以將這個參數設置爲OFF

                            Centos  6有效,7無此參數,且不顯示此信息

                    

               16    status頁面

                            需開啓模塊:

                                   LoadModule  status_module modules/mod_status.so

                                   <location  /server-status>

                                                  SetHandler server-status

                                                  Order allow,deny

                                                  allow from 192.168.65                                                                

                                    </location>

                                    Extendedstatus ON

                     查看頁面:   

                                    192.168.65.150/server-status

                     認證方式:

                                    可以同時使用基於賬號密碼認證

 

               

               17    虛擬主機

                            站點標識:    socket  (IP:PORT)

                    

                     三種實現方式:

                            基於ip:爲每個虛擬主機準備至少一個IP地址,基於ip報文頭部識別

                            基於port:爲每個虛擬主機使用至少一個獨立的port,基於tcp報文頭部識別

                            基於FQDN:爲每個虛擬主機使用至少一個FQDN,基於http數據頭部來識別

                    

                     注意:一般虛擬機不要與main主機混用;因此,要使用虛擬主機,一般禁用main主機

                     禁用方法:註釋中心主機的 Documentroot 指令

 

                     虛擬主機的配置方法:

                                    <VirtualHost IP:PORT>

                                           servername FQDN

                                           Documentroot "/path"

                                    </VirtualHost>

                                    建議:將上述配置存放在獨立的配置文件中

                    

                     其他可用指令:

                                    ServerAlias:虛擬主機的別名,可多次使用

                                    errorlog

                                    customlog

                                   <directory  "/path">

                                           ...

                                    </directory>

                                    alias

                    

                     配置示例:

                     基於ip和port實現虛擬主機

                                    <VirtualHost 192.168.65.150:80>

                                                  DocumentRoot "/app/web1/"

                                                  servername web1.wow.com

                                                  errorlog "/var/log/httpd/web1.error_log"

                                                  customlog "/var/log/httpd/web1.access_log" combined

                                    </VirtualHost>

 

                                    <VirtualHost 192.168.65.151:80>

                                                  DocumentRoot "/app/web2/"

                                                  servername web2.wow.com

                                                  errorlog "/var/log/httpd/web2.error_log"

                                                  customlog "/var/log/httpd/web2.access_log" combined

                                    </VirtualHost>

 

                                    <VirtualHost 192.168.65.151:8080>                                                            

                                                  servername web3.wow.com

                                                  DocumentRoot "/app/web3/"

                                                  errorlog "/var/log/httpd/web3.error_log"

                                                  customlog "/var/log/httpd/web3.access_log" combined

                                    </VirtualHost>                                   

 

                     基於FQDN實現虛擬主機:

                                    NameVirtualHost 192.168.65.150:80                                                            

 

                                    <VirtualHost 192.168.65.150:80>

                                                  servername web1.wow.com

                                                  DocumentRoot "/app/web1/"

                                                  errorlog "/var/log/httpd/web1.error_log"

                                                  customlog "/var/log/httpd/web1.access_log" combined

                                    </VirtualHost>

 

 

                                    <VirtualHost 192.168.65.150:80>

                                                  servername web2.wow.com

                                                  DocumentRoot "/app/web2/"

                                                  errorlog "/var/log/httpd/web2.error_log"

                                                  customlog "/var/log/httpd/web2.access_log" combined

                                    </VirtualHost>

 

                                    <VirtualHost 192.168.65.150:80>

                                                  servername web3.wow.com

                                                  DocumentRoot "/app/web3/"

                                                  errorlog "/var/log/httpd/web3.error_log"

                                                  customlog "/var/log/httpd/web3.access_log" combined

                                    </VirtualHost>

        

                    

                     注意:    centos6基於FQDN必須加

                                           NameVirtualHost *:80   

                                    

                                    centos7添加虛擬主機需要對每個目錄添加授權

                                           <directory "/app/">

                                                  require all granted

                                           </directory>

        

mod_deflate模塊:

               使用mod_deflate模塊壓縮頁面又換傳輸速度

               使用場景:

                     (1)節約帶寬,額外消耗cpu;同時,可能有些較老瀏覽器不支持

                     (2)壓縮適於壓縮的資源,例如文本文件

                    

               實現步驟:

                     1     確認mod_deflate處於開啓狀態

                            LoadModule  deflate_module modules/mod_deflate.so SetOutputFilter  DEFLATE

                    

                     2     添加如下信息到配置文件的任意位置

                             

                            Setoutputfilter  DEFLATE

 

                            # mod_deflate  configuration

                            # Restrict  compression to these MIME types

                             AddOutputFilterByType DEFLATE text/plain

                             AddOutputFilterByType DEFLATE text/html

                             AddOutputFilterByType DEFLATE application/xhtml+xml

                             AddOutputFilterByType DEFLATE text/xml

                             AddOutputFilterByType DEFLATE application/xml

                             AddOutputFilterByType DEFLATE  application/x-javascript

                             AddOutputFilterByType DEFLATE text/javascript

                             AddOutputFilterByType DEFLATE text/css

 

 

                            #Level of  compression (Highest 9 - Lowest 1)

                             DeflateCompressionLevel 9

 

                            # Netscape 4.x  只壓縮text/html

                            BrowserMatch  ^Mozilla/4 gzip-only-text/html

 

                            #Netscape  4.06-08三個版本 不壓縮

                            BrowserMatch  ^Mozilla/4\.0[678] no-gzip

 

                            #Internet  Explorer標識本身爲“Mozilla / 4”,但實際上是能夠處理請求的壓縮。

                             #如果用戶代理首部匹配字符串“MSIE”(“B”爲單詞邊界”),就關閉之前定

                            #義的限制

                            BrowserMatch  \bMSI[E] !no-gzip !gzip-only-text/html

                    

                     3     重新裝載配置文件

                            systemctl reload  httpd

        

               測試:

                            curl -I  wb1.wow.com

                            curl -I wb1.wow.com  --compressed

        

        

https 通信過程:

               https:http over ssl

               https通信過程

                     1     建立tcp連接

                             客戶端發起請求,建立到服務器端口443的tcp連接,三次握手

                     2     建立ssl會話

                            (1)客戶端發送可供選擇的加密方式,並向服務器請求證書

                            (2)服務器端發送證書以及選定的加密方式給客戶端

                            (3)客戶端取得證書並進行證書驗證

                                    如果信任給其發證書的CA

                                   (a)  驗證證書來源的合法性,用CA的公鑰解密證書上數字簽名

                                   (b)  驗證證書的內容的合法性:完整性檢驗

                                           即使用證書中給定的單向加密算法加密證書內容生成指紋,並與解密

                                           數字簽名之後得到的指紋對比是否一致

                                   (c)    檢查證書的有效期限

                                   (d)  檢查證書是否被吊銷

                                   (e)  證書中擁有者的名字,與訪問的目標主機是否一致

                            (4)客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密此數據發送

                                    給服務器,完成祕鑰交換

                            (5)服務器用此密鑰加密用戶請求的資源,響應給客戶端

                     3     事務處理完畢之後,先斷開ssl連接,在斷開tcp連接

               

               注意事項:

                            SSL是基於IP地址實現,單IP的主機僅可以使用一個https虛擬主機

                             

https 實現:

               1     爲服務器申請數字證書

                            建立私有CA

                             在服務器創建證書籤署請求

                            CA簽證

        

               2     配置httpd支持使用ssl,及使用的證書

                     安裝模塊:   

                                   yum install  mod_ssl -y

                     修改配置文件:   

                                   vim  /etc/httpd/conf.d/ssl.conf

                                    DocumentRoot

                                    ServerName

                                    SSLCertificateFile           服務器證書文件路徑

                                    SSLCertificateKeyFile      服務器私鑰文件

                    

               3     測試基於https訪問相應的主機

                            openssl  s_client   [-connect host:port] [-cert filename]

                                   [-CApath  directory] [-CAfilefilename]

                    

                     使用curl命令測試:

                     對比:

                                   curl  https://wb1.wow.com 

                                   curl --cacert  cacert.pem   https://wb1.wow.com

                             

               4     http重定向https

                                   將http請求轉發至https的URL

                     重定向:

                                   Redirect  [status] URL -path URL

 

                      status:

                            1     permanent:returns a permanent redirect  status(301) indicating that

                                   the resource  has moved permanently

                            2     temp:returns a temporary redirect  status(302).this is the default

                    

                     示例:

                                   Redirect temp  / https://www.testwow.com

 

                     注意:   

                                    如果定義了虛擬機提供https服務,再定義重定向"/"到 https

                                    會出現循環重定向,無法正常打開頁面

                                    如下:

                                           <virtualhost *:80>

                                                         servername web1.wow.com

                                                         documentroot "/data/www/wb1"

                                                         errorlog "/var/log/httpd/wb1_error_lor"

                                                         customlog "/var/log/httpd/wb1_log" combined

                                           </virtualhost>

 

                                           <virtualhost *:80>

                                                         servername wb2.wow.com

                                                         documentroot "/data/www/wb2"

                                                         errorlog "/var/log/httpd/wb2_error_log"

                                                         customlog "/var/log/httpd/wb2_log" combined

                                           </virtualhost>                                    

 

                                           redirect temp / https://wb1.wow.com/

                                    

                                    此段代碼,wb1實現了https,如果註釋掉redirect行

                                                  #redirect temp / https://wb1.wow.com/

                                    那麼測試wb1.wow.com wb2.wow.com https://wb1.wow.com  均正常

                                    但是去掉redirect行的註釋之後,所有頁面均無法正常訪問

        

HSTS:

               HSTS: http strict transport  security

               服務器端配置支持HSTS後,會在給瀏覽器返回的HTTP首部中攜帶HSTS字段,瀏覽器獲取到該信息

               後,會將所有的HTTP訪問請求在內部做307跳轉到HTTPS。而無需任何網絡過程

               

               HSTS preload list

                     是chrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用chrome瀏覽器訪問

                     時,會自動轉換成https。

                      firefox,safari,edge瀏覽器也會採用這個列表

                    

                                    

               實現HSTS:

                            vim  /etc/httpd/conf/httpd.conf

                            添加如下行即可

                            Header always set  Strict-Transport-Security "max-age=31536000"

                            RewriteEngine  on

                            RewriteRule ^(/.*)$  https://%{HTTP_HOST}$1 [redirect=302]                      

                                    

 

httpd自帶的工具程序:                                  

               htpasswd:basic認證基於文件實現時,用到的賬號密碼文件生成工具

               apachectl:       httpd自帶的服務控制腳本,支持start和stop

               rotalelogs:日誌滾動工具

               

httpd的壓力測試工具:

               ab,webbench,http_load,seige

               jmeter     開源

               loadrunner    商業,有認證

               tcpcopy 網頁,複製生產環境中的真實請求,並將之保存

               

               ab命令的用法:

                            來自 httpd-tools 包

                            ab [options]  URL

                                   -n   請求總數

                                   -c   模擬的並行數

                                   -k   以持久連接模式測試

               示例

                            ab -c 100 -n 10000  http://www.testwow.com/

               注意:

                            URL  後面需加上 "/"

               ulimit -n #     調整能打開的文件數

                             

        

        

 

 

 

 

        

httpd 2.4  :----------------------------------------------------------------------

        

httpd2.4 新特性:

                            MPM支持運行爲DSO機制;以模塊形式按需加載

                            event MPM  生產環境可用

                            異步讀寫機制

                             支持每模塊及每目錄的單獨日誌級別定義

                             每請求相關的專用配置

                             增強版的表達式分析器

                             毫秒級持久連接時長定義

                            基於FQDN的虛擬主機不需要NameVirtualHost 指令

                            新指令,allowoverridelist

                             支持用戶自定義變量

                            更低的內存消耗

               

                             修改了一些配置機制:

                                           不再支持使用order deny,allow  來做基於IP的訪問機制

                            新模塊:

                                          1     mod_proxy_fcgi

                                           FastCGI Protocol backend for mod_proxy

                                          2     mod_remoteip

                                           Replaces the apparent client remote IP address and hostname for the  request

                                          with  the IP address list presented by a proxies or a load balancer via the request  

                                           headers.

                                          3     mod_ratelimit

                                           Provides Bandwidth Rate Limiting for Clients

                                           

               安裝:

                            centos7:yum安裝,源碼編譯安裝

                             centos6:源碼編譯

               

               Rpm安裝程序環境:

                     配置文件:

                             /etc/httpd/conf/httpd.conf

                             /etc/httpd/conf.d/*.conf

                     模塊相關的配置文件:          

                             etc/httpd/conf.modules.d/*.conf

                            systemd unit file:

                             /usr/lib/systemd/system/httpd.service

                     主程序文件:

                             /usr/sbin/httpd

                             httpd-2.4支持MPM的動態切換             

                     日誌文件:

                             /var/log/httpd

                             access_log:訪問日誌

                             error_log:錯誤日誌

                     站點文檔:

                             /var/www/html

                     模塊文件路徑:

                             /usr/lib64/httpd/modules

                     服務控制:

                            systemctl  enable|disable  httpd.service

                            systemctl  {start|stop|restart|status}  httpd.service

 

httpd-2.4配置:

               1     切換使用的MPM

                     centos7 rpm安裝

                            vim  /etc/httpd/conf.modules.d/00-mpm.conf

                            啓用要啓用的MPM相關的LoadModule指令即可

                     centos6編譯安裝:

                            vim  /etc/httpd24/httpd.conf

                            include  /etc/httpd24/extra/httpd-mpm.conf

                            LoadModule  mpm_event_module modules/mod_mpm_event.so

                             

               2     主目錄

                            Documentroot  /path

                             

               3     基於IP的訪問控制

                             無明確授權的目錄,拒絕訪問

                             允許所有主機訪問:    require all granted

                             拒絕所有主機訪問:     require all denied

                            控制特定的IP訪問:

                                           Require ip IPADDR:   授權指定來源的IP訪問

                                           Require not ip IPADDR:拒絕特定的IP訪問

                             控制特定的主機訪問:

                                           Require host  HOSTNAME        授權特定主機訪問

                                           Require not host HOSTNAME     拒絕

 

                             HOSTNAME:

                                           FQDN:    特定主機

                                           domain.tld      指定域名下的所有主機

                    

                      不能有失敗,至少有一個成功匹配才成功,即失敗優先:

                     匹配全部條件方可訪問

                                    <RequireAll>

                                           require all granted

                                           require not ip 172.16.1.1       拒絕特定主機

                                    </RequireAll>

 

                      多個語句有一個成功,則成功,即成功優先:

                     匹配任意條件即可訪問:

                                    <RequireAny>

                                           require all denied

                                           require ip 172.16.1.1      允許特定IP

                                    </RequireAny>

                                           

               4     虛擬主機:   

                            基於FQDN的虛擬主機不再需要NameVirutalHost指令

                             任意目錄下的頁面只有顯式授權才能被訪問

                                           

               5     ssl:

                            安裝ssl_mod,和httpd2.2相同

               

               6     持久連接功能默認啓用,5  100

                     KeepAlive  on

                             KeepAliveTimeout   #ms

                            MaxKeepAliveRequests  100

                             毫秒級持久連接時長定義

                    

        

                                           

http協議進階:-------------------------------------------------------------------

 

http報文語法格式:

               reuqest報文:

                            <method>  <request-URL> <version>

                             <headers>

                             

                             <entity-body>

               reponse報文:

                            <version>  <status> <reason-phrase>

                             <headers>

                             

                             <entity-body>

               

               method:請求方法,標明客戶端希望服務器對資源執行的動作

                             GET,HEAD,POST等

                             

               version:

                             HTTP/<major>.<minor>

               

               status:     狀態碼,如200,301,302,404,502;

                             標記請求處理過程中發生的情況

               

               reason-phrase:

                             狀態碼所標記的狀態的簡要描述

               

               headers:

                             每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,後面跟

                             一個冒號,而後跟一個可選空格,接着是一個值

                                           首部字段名: 值

               entity-body:

                             請求時附件的數據或響應時附加的數據

                             

method:方法

               GET: 從服務器獲取一個資源

               HEAD:   只從服務器獲取文檔的響應首部

               POST:   向服務器輸入數據,通常會再由網關程序繼續處理

               PUT:      將請求的主體部分存儲在服務器中,如上傳文件

               DELETE:請求刪除服務器上指定的文檔

               TRACE:    追蹤請求到達服務器中間經過的代理服務器

               OPTIONS:請求服務器返回指定資源吃食使用的請求方法

               

協議查看或分析的工具:

               tcpdump,wireshark,tshark

               

http協議狀態碼分類:

               1xx  100-101         信息提示

               2xx  200-206         成功

               3xx  300-305         重定向

               4xx 400-415           錯誤類信息,客戶端錯誤

               5xx 500-505           錯誤類信息,服務器端錯誤

               

http協議常用的狀態碼:

               200: 成功,請求數據通過相應報文的entity-body部分發送;OK

               301:      請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明瞭

                             資源現在所處的新位置,Moved permanenty

               302:      響應報文location指明資源臨時新位置  moved temporarily

               304:      客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過此響應

                             轉態碼通知客戶端,not modified

               401:      需要輸入賬號和密碼認證方能訪問資源;unauthorized

               403:      請求被禁止;forbidden

               404:      服務器無法找到客戶端請求的資源,not found

               500:      服務器內部錯誤,internal server  error

               502:      代理服務器從後端服務器收到了一條僞響應,如無法連接到網關,bad  gateway

               503:      服務不可用,臨時服務器維護或過載,服務器無法處理請求

               504         網關超時

               

headers:

               request 報文頭部示例:

                            Accept   

                             text/css,*/*;q=0.1

                            Accept-Encoding 

                            gzip, deflate,  br

                            Accept-Language

                             zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

                            Cache-Control     

                             max-age=0

                            Connection   

                             keep-alive

                            Cookie   

                             MySQL_S=nr39nu9jdjkr0u2i1qmi0l…174105336;  s_sq=%5B%5BB%5D%5D

                            Host

                             labs.mysql.com

                             If-Modified-Since   

                            Tue, 05 Jun 2018  17:50:40 GMT

                            Referer  

                             https://dev.mysql.com/doc/refm…rce-configuration-options.html

                            User-Agent   

                            Mozilla/5.0 (Windows  NT 6.3; W…) Gecko/20100101 Firefox/61.0

               

               response報文頭部示例:

                            Cache-Control     

                            no-store, no-cache,  must-revalidate

                            Cache-Control     

                            no-cache,  private

                            Connection   

                             Keep-Alive

                             Content-Encoding

                             gzip

                            Content-Length   

                             32057

                            Content-Type      

                            text/html;  charset=UTF-8

                            Date      

                            Thu, 28 Jun 2018  09:30:09 GMT

                            Expires   

                            Thu, 19 Nov 1981  08:52:00 GMT

                            Keep-Alive    

                            timeout=5,  max=10

                            Pragma 

                             no-cache

                            Server    

                             Apache

                             Strict-Transport-Security      

                             max-age=15768000

                            Vary

                             Accept-Encoding

                             X-Content-Type-Options     

                             nosniff

                            X-Frame-Options

                             SAMEORIGIN

                             X-XSS-Protection   

                            1;  mode=block

 

 

http首部字段:

               HTTP首部字段包含的信息最爲豐富,首部字段同時存在於請求和響應報文內,

               並涵蓋http報文相關的內容信息。使用首部字段是爲了給客戶端和服務器端

               提供報文主體大小,所使用的語言,認證信息等內容

               

               首部字段結構:     HTTP首部字段是由首部字段名和字段值構成的,中間用

                                           ":"分隔

               

               字段值對應單個HTTP首都字段可以有多個值

               

               報文首部中出現了兩個或以上具有相同首部字段名的首部字段時,在規範內

               尚未明確,根據瀏覽器內部處理邏輯的不同,優先處理的順序可能不同,結果

               可能並不一致

               

首部的分類:

               通用首部:請求報文和響應報文兩方都會使用的首部

                            date:           報文的創建時間

                             connection:連接狀態,如keep-alive,close

                            via:         顯示報文經過的中間節點(代理,網關)

                             chche-control:     控制緩存,如緩存時長

                             MIME-Version:    發送端使用的MIME版本

                            Warning:     錯誤通知

                             

               請求首部:從客戶端向服務器端發送報文時使用的首部。補充了請求的附加內容、

                              客戶端信息,請求內容相關優先級等信息

                             Accept:通知服務器自己可接受的媒體類型

                             accept-charset:客戶端可接受字符集

                             accept-Encoding:客戶端可接受的編碼格式,如gzip

                             accept-Language:客戶端可接受的語言

                             

                             Client-IP:      請求的客戶端IP

                            Host:            請求的服務器名稱和端口號

                            Referer:       跳轉至當前URI的前一個URL

                             User-Agent:客戶端代理,瀏覽器版本

 

                             

               響應首部:從服務器端向客戶端返回響應報文時使用的首部。補充了響應的附加

                              內容,也會要求客戶端附加額外的內容信息

                     1     信息性:

                                    Age:從最初創建開始,響應持續時長

                                    server:服務器程序軟件名稱和版本

                     2     協商首部:

                                    accept-ranges:服務器可接受的請求範文類型

                                    vary:     服務器查看的其他首部列表

                     3     安全響應首部:

                                    set-cookie:向客戶端設置cookie

                                    set-cookie2:與上面相似

                                    www-authenticate:來自服務器對客戶端的質詢列表

                             

 

               實體首部:針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新

                              時間等與實體相關的信息

                            Allow:  列出對此資源實體可使用的請求方法

                             Location:告訴客戶端真正的實體位於何處

                            Content  -Encoding:對主體執行的編碼

                            Content  -Language:理解主體時最適合的語言

                            Content -Length:  主體的長度

                            Content -Location:  實體真正所處位置

                            Content  -Type:主體的對象類型,如text

                            緩存相關:

                             ETag:實體的擴展標籤

                             Expires:實體的過期時間

                            Last  -Modified:最後一次修改的時間

               擴展首部:

        

               條件式請求首部:

                             Expect:允許客戶端列出某請求所要求的服務器行爲

                             if-modified-since:自從指定的時間之後,請求的資源是否發生過修改

                             if-unmodified-since:與上面相反

                             if-none-match:本地花村中存儲的文檔etag標籤是否與服務器文檔的etag

                                           不匹配

                             if-match:與上面相反

               

               安全請求首部:

                            authorization:  向服務器發送認證信息,如賬號和密碼

                             cookie:客戶端向服務器發送cookie

                             cookie2:用於說明請求支持的cookie 版本

                             

               代理請求首部:

                             proxy-authorization:向代理服務器認證

                             

 

cookie:

               HTTP 是一種無狀態協議。

               協議自身不對請求和響應之間的通信狀態進行保存。

               也就是說在 HTTP  這個級別,協議對於發送過的請求或響應都不做持久化處理。

               這是爲了更快地處理大量事務,確保協議的可伸縮性,而特意把 HTTP 協議設

               計成如此簡單的。

               可是隨着 Web 的不斷髮展,很多業務都需要對通信狀態進行保存。

               於是引入了 Cookie 技術。

               使用 Cookie 的狀態管理Cookie  技術通過在請求和響應報文中寫入 Cookie

               信息來控制客戶端的狀態。

               Cookie 會根據從服務器端發送的響應報文內的一個叫做 Set -Cookie  的首部字段

               信息,通知客戶端保存Cookie。

               當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie  

               值後發送出去。

               服務器端發現客戶端發送過來的 Cookie 後,

               會去檢查究竟是從哪一個客戶端發來的連接請求,然後對比服務器上的記錄,

               最後得到之前的狀態信息

 

Set -Cookie首部字段:

               Set -cookie首部字段示例:

                     Set -Cookie: status=enable;  expires=Fri, 24 Nov 2017 20:30:02 GMT; path=/;

               NAME=VALUE 

                     賦予  Cookie 的名稱和其值,此爲必需項

               expires=DATE   

                     Cookie  的有效期,若不明確指定則默認爲瀏覽器關閉前爲止

               path=PATH 

                     將服務器上的文件目錄作爲Cookie的適用對象,若不指定則默認爲文檔所在的文件目錄

               domain=域名   

                     作爲  Cookie 適用對象的域名,若不指定則默認爲創建Cookie的服務器的域名

               Secure 

                     僅在  HTTPS 安全通信時纔會發送 Cookie

               HttpOnly 

                     加以限制使 Cookie 不能被 JavaScript 腳本訪問

 

 

 

curl工具:----------------------------------------------------------------------

               curl是基於URL語法在命令行方式下工作的文件傳輸工具

               它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE,LDAP等協議。

               支持HTTPS認證,並且支持HTTP的POST,PUT等方法。FTP上傳,kerberos認證,HTTP上傳,

               代理服務器,cookies,用戶名/密碼認證,下載文件斷點續傳,上載文件斷點續傳,

               HTTP代理服務器管道(proxy tunnneling),還支持IPv6,socks5代理服務器

               通過http代理服務器上傳文件到FTP服務器等,功能十分強大

               

               使用格式:

                            curl [options]  [URL...]

               選項:

                             -A,--user-agent<sting>             設置用戶代理髮送給服務器

                            -e,--referer  <URL>                    來源網址

                            --cacert  <file>                    CA證書(ssl)

                            -k,--insecure                      允許忽略證書進行SSL連接

                            --compressed                            要求返回是壓縮的格式

                            -H,--header  <line>                    自定義首部信息傳遞給服務器

                            -i                                                顯示頁面內容,包括報文首部信息

                            -I,--head                                    只顯示響應報文首部信息

                            -D,--dump-header <file>        將URL的header信息存放在指定文件中

                            --basic                              使用HTTP基本認證

                            -u,--user  <user:[password]> 輸入服務器的用戶和密碼

                            -L                                              如果有3xx響應碼,重新發送請求到新位置

                            -O                                              使用URL中默認的文件名保存文件到本地

                            -o <file>                              將網絡文件保存爲指定的文件中

                            --limit-rate  <rate>                     設置傳輸速度

                            -0,--http1.0                        數值0,使用HTTP1.0

                            -v,--verbose                      更詳細

                            -C                                              選項可對文件使用斷點續傳功能

                            -c,--cookie-jar  <file-name> 將url中cookie存放在指定文件中

                            -x,--proxy  <proxyhost[:port]> 指定代理服務器地址

                            -X,--request  <command>          向服務器發送指定請求方法

                            -U,--proxy-user  <user:password> 代理服務器用戶和密碼

                            -T                                              選項將指定的本地文件上傳到FTP服務器上

                            --data,-d                                    指定使用POST方式傳遞數據

                            -b name=data                           從服務器響應set-cookie得到值,返回給服務器

               

               示例:

                     使用basic認證:

                            curl --basic --user  user5:centos 192.168.65.132/download/

                    

                     僞造agent和referer

                            curl -A  "sogoliulanqi" -e "www.baidu.com" 192.168.65.132

                             access_log記錄:

                            192.168.65.155 - -  [01/Jul/2018:11:45:39 +0800] "GET / HTTP/1.1"

                                   200 175  "www.baidu.com" "sogoliulanqi"

                     下載並限速:

                            curl  192.168.65.132/mariadb -o mariadb-server --limit-rate  1024000

                    

elikes工具:

               elinks [options] [url]...

                     -dump          非交互式模式,將url的內容輸出至標準輸出

                     -source         打印源碼

 

 

 

Sentfile機制:

               不用 sendfile 的傳統網絡傳輸過程:

                      read(file, tmp_buf ,  len)

                      write(socket, tmp_buf ,  len)

               硬盤 >> kernel buffer >> user buffer  >> kernel socket buffer >> 協議棧

               

               一般網絡應用通過讀硬盤數據,寫數據到 socket 來完成網絡傳輸,底層執行過程:

                  1     系統調用 read()  產生一個上下文切換:從 user mode 切換到 kernel  mode,然後 DMA 執行拷貝,

                             把文件數據從硬盤讀到一個 kernel buffer 裏。

                  2     數據從 kernel buffer  拷貝到 user buffer,然後系統調用 read()  返回,這時又產生一個上下文切換:

                            從kernel mode 切換到 user  mode

                  3     系統調用 write()  產生一個上下文切換:從 user mode 切換到 kernel  mode,然後把步驟2讀到

                            user buffer  的數據拷貝到 kernel buffer(數據第2次拷貝到 kernel buffer),不過這次是個不同的

                            kernel  buffer,這個 buffer和 socket  相關聯。

                4       系統調用 write() 返回,產生一個上下文切換:從 kernel mode  切換到 user mode(第4次切換),然後

                            DMA從 kernel buffer 拷貝數據到協議棧(第4次拷貝)

               

               上面4個步驟有4次上下文切換,有4次拷貝,如果能減少切換次數和拷貝次數將會有效提升性能   

               在kernel 2.0+ 版本中,系統調用  sendfile() 就是用來簡化上面步驟提升性能的。

               

               sendfile() 不但能減少切換次數而且還能減少拷貝次數

               

               用 sendfile() 來進行網絡傳輸的過程:

                sendfile(socket, file, len);

                硬盤 >> kernel buffer (快速拷貝到kernel socket buffer) >> 協議棧

                1       系統調用 sendfile() 通過 DMA 把硬盤數據拷貝到 kernel buffer,然後數據被

                            kernel  直接拷貝到另外一個與   socket 相關的 kernel buffer。這裏沒有 user mode 和

                            kernel mode  之間的切換,在 kernel 中直接完成了從一個 buffer  到另一個 buffer 的

                            拷貝。

                2       DMA 把數據從 kernel buffer 直接拷貝給協議棧,沒有切換,也不需要數據從  user

                            mode 拷貝到 kernel mode,因爲數據就在  kernel 裏

 

               配置選項:     

                            EnableSendfile  on

                             httpd2.4默認啓用

 

反向代理功能:

               啓用反向代理:

                     ProxyPass "/"  "http://www.example.com/"

                     ProxyPa***everse "/"  "http://www.example.com/"

 

               特定url反向代理:

                     proxypass "/images"  "http://www.example.com/"

                     proxypa***everse "/images"  "http://www.example.com/"

 

               示例:

                            proxypass  "/homepage" "http://www.testwow.com"

                            proxypa***everse  "/homepage" "http://www.testwow.com"

                     測試結果:

                            curl  wb1.wow.com

                            curl  wb1.wow.com/homepage

               注意:

                             後端服務器訪問日誌中客戶端爲代理服務器

                             且代理服務器也會記錄日誌,客戶端爲發起請求的用戶

 

 

--------------------------------------------------------------------------------

編譯安裝httpd-2.4

 

ARP項目:

               APR(Apache portable Run-time libraries,Apache可移植運行庫) 主要爲上

               層的應用程序提供一個可以跨越多操作系統平臺使用的底層支持接口庫。在早

               期的Apache版本中,應用程序本身必須能夠處理各種具體操作系統平臺的細節,

               並針對不同的平臺調用不同的處理函數

            

               隨着Apache的進一步開發,Apache組織決定將這些通用的函數獨立出來併發

               展成爲一個新的項目。這樣,APR的開發就從Apache中獨立出來,Apache僅

               僅是使用 APR而已。目前APR主要還是由Apache使用,由於APR的較好的移植

               性,因此一些需要進行移植的C程序也開始使用APR,開源項目比如用於服務器

               壓力測試的Flood loader tester,該項目不僅僅適用於Apache,

               http://httpd.apache.org/test/flood

 

 

在centos6上編譯安裝httpd-2.4

 

安裝前準備:

               1     安裝http-2.4

                     依賴於apr-1.4+,apr-util-1.4+,[apr-iconv]

                     apr: apache portable  runtime,     解決跨平臺實現

                     centos6.9:默認安裝爲apr1.3.9,apr-util-1.3.9

               

               2     安裝前準備開發包

                            yum groupinstall  "Development Tools" "Server Platform Development"

                     相關包:

                            yum install  pcre-devel openssl-devel expat-devel

               

               3     下載源代碼並解壓縮

                             httpd-2.4.33.tar.bz2

                             apr-1.6.3.tar.gz

                             apr-util-1.6.1.tar.gz

               

編譯安裝方法一:

               1     安裝apr-1.4+

                            cd  apr-1.6.3

                            ./configure  --prefix=/app/apr

                            make && make  install

               

               2     安裝apr-util-1.4+

                            cd  ../apr-util-1.6.1

                            ./configure  --prefix=/app/apr-util --with-apr=/app/apr

                            make -j 2 &&  make install

                             

               3     安裝httpd2.4

                            cd  ../httpd-2.4.33

                            ./configure  --prefix=/app/httpd24 --enable-so \

                            --enable-ssl  --enable-cgi --enable-rewrite \

                            --with-zlib  --with-pcre --with-apr=/app/apr/ \

                             --with-apr-util=/app/apr-util/ \

                            --enablemodules=most  --enable-mpms-shared=all \

                             --with-mpm=prefork

                            make -j 4 &&  make install

 

編譯安裝方法二:

               1     cp -av apr-util-1.6.0  httpd-2.4.27/srclib/apr -util

                     cp -av apr-1.6.2  httpd-2.4.27/srclib/apr

 

               2     cd  httpd-2.4.33

                     ./configure  --prefix=/appl/httpd24 \

                     --enable-so --enable-ssl  --enable-cgi \

                     --enable-rewrite  --with-zlib --with-pcre \

                     --with-includedapr  --enable-modules=most \

                     --enable-mpms-shared=all  --withmpm=prefork

               

               3     make && make  install

 

編譯安裝http-2.4程序環境:

               自帶的服務控制腳本:

                             /app/httpd24/bin/apachectl  start|stop|restart|status

 

               應用程序目錄:/app/httpd24/bin/

               網頁文件目錄:/app/httpd24/htdocs

               

               自定義啓動腳本:(參考httpd-2.2的服務腳本)

                     cp /etc/rc.d/init.d/httpd  /etc/rc.d/init.d/httpd24

                     vim  /etc/rc.d/init.d/httpd24

                             apachectl=/app/httpd24/bin/apachectl

                             httpd=${HTTPD-/app/httpd24/bin/httpd}

                             pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}

                             lockfile=${LOCKFILE-/var/lock/subsys/httpd24}                             

 

                     service httpd24  start|stop

                     chkconfig --add httpd24  

 

               配置文件:

                     默認沒有httpd24.d/ 可以自己建立並在主配置文件中使用include  即可

                                       

2018年7月3日14:53:32

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章