圖解HTTP權威指南(三)| Web伺服器對HTTP請求的處理和響應
阿新 • • 發佈:2020-12-30
作者簡介
李先生(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、接收請求報文
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/files2)虛擬託管的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