1. 程式人生 > >圖解HTTP權威指南(三)| Web伺服器對HTTP請求的處理和響應

圖解HTTP權威指南(三)| Web伺服器對HTTP請求的處理和響應

作者簡介

  李先生(Lemon),高階運維工程師(自稱),SRE專家(目標),夢想在35歲買一輛保時捷。喜歡鑽研底層技術,認為底層基礎才是王道。一切新技術都離不開作業系統(CPU、記憶體、磁碟)、網路等。堅持輸入輸出,記錄自己學習的點滴,在平凡中堅持前行,總有一天會遇見不一樣的自己。公眾號:運維汪(ID:Leeeee_Li)。  
                                                                                        

 

 

一、問題

解釋Web伺服器是如何處理HTTP事務的  

二、Web伺服器

Web伺服器會對HTTP請求進行處理並提供響應。Web伺服器請求的七大步驟:   1)接受客戶端連線 2)接收請求報文 3)處理請求 4)資源對映及訪問 5)構建響應 6)傳送響應 7)記錄日誌  

 

1、接受客戶端連線

  1)處理新連線 客戶端請求一條到Web伺服器的TCP連線時,Web伺服器會建立連線,判斷連線的另一端是哪個客戶端,從TCP連線中將IP地址解析出來。一旦新連線建立起來並接受,伺服器就會將新連線新增到其現存Web伺服器連線列表中,做好監視連線上資料傳輸的準備。Web伺服器可以隨意拒絕或立即關閉任意一條連線。有些Web伺服器會因為客戶端IP地址或主機名是未認證的,或者因為它是已知的惡意客戶端而關閉連線。Web伺服器也可以使用其他技術識別。   2)客戶端主機名識別 可以用”反向DNS“對大部分Web伺服器進行配置,以便將客戶端IP地址轉換成客戶端主機名。Web伺服器可以將客戶端主機名用於詳細的訪問控制和日誌記錄。需要注意的是,主機名查詢可能會花費很長的時間,這樣會降低Web事務處理的速度。很多大容量的Web伺服器會禁止主機名解析,或者只允許對特定內容進行解析。   可以用配置指令Hostnamelookups啟用Apache的主機查詢功能。如只打開HTML和CGI資源的主機名解析功能。
HostnameLookups off
<Files ~ "\.(html|htm|cgi)$">
   HostnameLookups on 
</Files>

 

3)通過ident確定客戶端使用者   伺服器可以通過ident協議找到發起HTTP連線的使用者名稱。這些資訊對Web伺服器的日誌記錄特別有用,流行的通用日誌格式的第二個欄位就包含了每條HTTP請求的ident使用者名稱。

 

 

1)客戶端開啟一條HTTP連線 2)伺服器開啟自己到客戶端ident服務113埠的連線 3)伺服器傳送一條簡單的請求,詢問與新連線相對應的使用者名稱,把那個從客戶端解析出包含使用者名稱的響應   Apache的IdentityCheck on指令告知Apache Web伺服器使用ident查詢功能,如果沒有ident資訊可用,Apache會用連字元(-)來填充ident日誌欄位。如果沒有ident資訊可用,在使用通用日誌格式的日誌檔案中,第二個欄位通常都是連字元。  

2、接收請求報文

當連線上有資料到達時,Web伺服器會從網路連線中讀取資料,並將請求報文中的內容解析出來。 1)解析請求報文時,Web伺服器的工作   1、解析請求行,查詢請求方法、指定的資源識別符號(URI)以及版本號,各項之間有一個空格隔開,並以一個回車換行(CRLF)序列作為行的結束; 2、讀取以CRLF結尾的報文首部; 3、檢測到以CRLF結尾的、標識首部結束的空行; 4、讀取請求主體     2)報文的內部表示法

 

3、連線的輸入/輸出處理結構

高效能的Web伺服器能夠同時支援數千條連線,每個客戶端都向伺服器打開了一條或多條連線。不同的Web伺服器會以不同的方式為請求服務。   單執行緒Web伺服器:單執行緒的Web伺服器一次只處理一個請求,直到其完成為止。一個事務處理結束之後,才去處理下一條連線。 多程序及多執行緒Web伺服器:多程序和多執行緒Web伺服器用多個程序,或更高效的執行緒同時對請求進行處理。 複用I/O的伺服器:在複用結構中,要同時監視所有連線上的活動。當連線的狀態發生變化時,就對那條連線進行處理,處理結束後,將連線返回到開放的連線列表中,等待下一次的狀態變化。只有在有事情可以做時才會對連線進行處理,在空閒連線上等待的時候並不會繫結執行緒和程序。 複用的多執行緒Web伺服器:將多執行緒和複用功能結合在一起,利用計算機的多個CPU。多個執行緒中(通常是一個物理處理器)的每一個都在觀察開啟的連線,並對每條連線(或開啟連線中的一個子集)執行任務。

 

3、處理請求   當Web伺服器接收到請求後,根據方法、資源、首部和可選的主體部分來對請求進行處理。     4、對資源的對映及訪問   1)docroot(文件的根目錄)   Web伺服器的檔案系統中有一個專門存放Web內容的目錄,稱為文件的根目錄(document root,或docroot)。當一個Web伺服器的根目錄為/usr/local/httpd/files,並且有一條/special/s.gif的請求到達時,他的訪問如圖

 

在Apache中,對配置檔案httpd.conf新增一行DocumentRoot行就可設定文件的根目錄

DocumentRoot /usr/local/httpd/files
  2)虛擬託管的docroot   虛擬託管的Web伺服器會在同一臺Web伺服器上提供多個Web站點,每個站點在伺服器上都有自己都有的文件根目錄。虛擬託管Web伺服器會根據URI或Host首部的IP或主機名來識別要使用的正確的文件根目錄。通過這種方式,及時請求的URI相同,託管在同一Web伺服器上的兩個Web站點也可以擁有完全不同的記憶體。   A請求進來時,獲取伺服器的/doc/aaa/index.html B請求進來時,獲取伺服器的/doc/bbb/index.html   在Apache可配置如下:
<VirtualHost www.aaa.com> 
    ServerName www.aaa.com 
    DocumentRoot /doc/aaa
    TransferLog /logs/aaa.access_log 
    ErrorLog /1ogs/aaa.error_log
</VirtualHost>

<VirtualHost www.bbb.com> 
    ServerName www.bbb.com 
    DocumentRoot /doc/bbb
    TransferLog /logs/bbb.access_log 
    ErrorLog /1ogs/bbb.error_log
</VirtualHost>

 

3)使用者的主目錄docroot   Docroot提供私有的Web站點時,通常會以斜槓和波浪號(/~)開始,如 A請求進來時,獲取伺服器的/home/mary/index.html B請求進來時,獲取伺服器的/home/ken/index.html     5、構建響應   一旦Web伺服器識別出了資源、就執行請求方法中的描述的動作,並返回響應報文。響應報文中包含有狀態碼、響應首部、如果生成了響應主體的話,還包括響應主體。   1)響應主體   如果事務處理產生了響應主體,就將內容放在響應報文中回送過去。如果有響應主體的話,響應報文中通常包括: a)描述了響應主體MIME型別的Content-Type首部; b)描述了響應主體長度的Content-Length首部; c)實際報文的主題內容   2)MIME型別   Web伺服器要負責確定響應主體的MIME型別。

 

 

a)根據副檔名確定MIME型別 Web伺服器可以用檔案的副檔名來說明MIME型別。Web伺服器會為每個資源掃描一個包含了所有副檔名的MIME型別的檔案,以確定MIME型別。Web伺服器用MIME型別檔案來設定資源輸出的Content-type首部。   b)魔法分類 Apache Web伺服器掃描每個資源的內容,並與一個已知模式表(魔法檔案)進行匹配,決定每個檔案的MIME型別。   c)顯示分類 對Web伺服器進行配置,使其不考慮檔案的副檔名和內容,強制特定檔案或目錄內容擁有某個MIME型別。   d)型別協商 通過配置Web伺服器,使其可以通過與使用者的協商來決定使用哪種格式以及相關的MIME型別。   3)重定向 Web伺服器有時會返回重定向響應而不是成功的報文。Web伺服器可以將瀏覽器重定向到其他地方來執行請求。重定向響應碼為3XX系列。Location響應首部包含了內容的新地址或優選地址的URL。   a)永久刪除的資源 資源可能已經被移動到了新的位置,或者被重新命名,有了一個新的URL。Web伺服器可以告訴客戶端資源已經被重新命名了,這樣客戶端就可以在從新地址獲取資源之前,更新書籤之類的資訊了。狀態碼301 Moved Permanently用於此類重定向。   b)臨時刪除的資源 資源被臨時移走了或重新命名了。伺服器可能希望將客戶端重定向到新的位置上去。但由於重新命名是臨時的,所以伺服器希望客戶端將來還可以回頭使用老的URL,不要對書籤進行更新。狀態嗎303 See Other以及狀態碼307 Temporary Redirect用於此類重定向。   c)URL增強 伺服器通常用重定向來重寫URL,往往用於嵌入上下文。當請求到達時,伺服器會生成一個新的包含了嵌入式狀態資訊的URL,並將使用者重定向到這個新的URL上。客戶端會跟隨這個重定向資訊,重新發起請求,但這次的請求會包含完整的、經過狀態增強的URL。狀態嗎303 See Other以及狀態碼307 Temporary Redirect用於此類重定向。

d)負載均衡 一個超載的伺服器收到一條請求,伺服器可以將客戶端重定向到一個負載不太重的伺服器上去。狀態嗎303 See Other以及狀態碼307 Temporary Redirect用於此類重定向。

e)伺服器關聯 Web伺服器上可能會有某些使用者的本地資訊,伺服器可以將客戶端重定向到包含了那個客戶端資訊的伺服器上去。狀態嗎303 See Other以及狀態碼307 Temporary Redirect用於此類重定向。

f)規範目錄名稱 客戶端請求的URL是一個不帶尾部斜線的目錄名時,大多數Web伺服器都會將客戶端重定向到一個加了斜線的URL上,這樣相對連結就可以正常工作了。     6、傳送響應   Web伺服器通過連線傳送資料,傳送資料與接收資料一樣可能有多條到客戶端的連線,有些是空閒的,有些在向伺服器傳送資料,還有一些在向客戶端回送響應資料。伺服器要記錄連線的狀態,還需要特別注意持久連線的處理。對於非持久連線,伺服器應該在傳送了整條報文之後,關閉自己這一端的連線。   7、記錄日誌   當事務結束時,Web伺服器會在日誌檔案中新增一個條目,來描述已執行的事務。  

三、學習交流

歡迎大家關注我的公眾號,一起交流、學習。

 

 

&n