HTTP权威指南记录 ---- Web服务器
Web服務(wù)器
Web服務(wù)器的實現(xiàn)
Web服務(wù)器會對HTTP請求進(jìn)行處理并提供響應(yīng)。術(shù)語"Web服務(wù)器"可以用來表示W(wǎng)eb服務(wù)器的軟件,也可以用來表示提供Web頁面的特定設(shè)備或計算機(jī)。
Web服務(wù)器實現(xiàn)了HTTP和相關(guān)的TCP連接處理。負(fù)責(zé)管理Web服務(wù)器提供的資源,以及對Web服務(wù)器的配置、控制及擴(kuò)展方面的管理。Web服務(wù)器邏輯實現(xiàn)了HTTP協(xié)議、管理著Web 資源,并負(fù)責(zé)提供We 服務(wù)器的管理功能。Web服務(wù)器邏輯和操作系統(tǒng)共同負(fù)責(zé)管理TCP連接。底層操作系統(tǒng)負(fù)責(zé)管理底層計算機(jī)系統(tǒng)的硬件細(xì)節(jié),并提供了TCP/IP網(wǎng)絡(luò)支持、負(fù)責(zé)裝載Web資源的文件系統(tǒng)以及控制當(dāng)前計算活動的進(jìn)程管理功能。
Web 服務(wù)器有各種不同的形式。
- 可以在標(biāo)準(zhǔn)的計算機(jī)系統(tǒng)上安裝并運行通用軟件Web服務(wù)器:通用的軟件Web服務(wù)器都運行在標(biāo)準(zhǔn)的、有網(wǎng)絡(luò)功能的計算機(jī)系統(tǒng)上。可以選擇開源軟件(比如Apache)或者商業(yè)軟件(比如微軟的IIS)。基本上所有的計算機(jī)和操作系統(tǒng)中都有可用的Web服務(wù)器軟件。
- 如果不想那么麻煩地去安裝軟件,可以買一臺Web服務(wù)器設(shè)備:通常會是一臺安裝在時髦機(jī)架上的計算機(jī),里面的軟件會預(yù)裝并配置好,是預(yù)先打包好的軟硬件解決方案。廠商會在他們選擇的計算機(jī)平臺上預(yù)先安裝好軟件服務(wù)器,并將軟件配置好。應(yīng)用解決方案不再需要安裝及配置軟件,通常可以極大地簡化管理工作。但是,Web服務(wù)器通常不太靈活,特性不太豐富,而且服務(wù)器硬件也不太容易重用或升級。
- 隨著微處理器奇跡般地出現(xiàn),有些公司甚至可以在少量計算機(jī)芯片上實現(xiàn)嵌入式Web服務(wù)器,使其成為完美的(便攜式)消費類設(shè)備管理控制臺:嵌入式服務(wù)器是要嵌入到消費類產(chǎn)品(比如打印機(jī)或家用設(shè)備)中去的小型Web服務(wù)器。嵌入式Web服務(wù)器允許用戶通過便捷的Web瀏覽器接口來管理其消費者設(shè)備。有些嵌入式Web服務(wù)器甚至可以在小于一平方英寸的空間內(nèi)實現(xiàn),但通常只能提供最小特性功能集。
Web服務(wù)器會做些什么
- 建立連接:接受一個客戶端連接,或者如果不希望與這個客戶端建立連接,就將其關(guān)閉。
- 接收請求:從網(wǎng)絡(luò)中讀取一條HTTP請求報文。
- 處理請求:對請求報文進(jìn)行解釋,并采取行動。
- 訪問資源:訪問報文中指定的資源。
- 構(gòu)建響應(yīng):創(chuàng)建帶有正確首部的HTTP響應(yīng)報文。
- 發(fā)送響應(yīng):將響應(yīng)回送給客戶端。
- 記錄日志:將與已完成事務(wù)有關(guān)的內(nèi)容記錄在一個日志文件中。
接受客戶端鏈接
如果客戶端已經(jīng)打開了一條到服務(wù)器的持久連接,可以使用那條連接來發(fā)送它的請求。否則,客戶端需要打開一條新的到服務(wù)器的連接。
處理新連接
客戶端請求一條到Web服務(wù)器的TCP連接時,Web服務(wù)器會建立連接,判斷連接的另一端是哪個客戶端,從TCP連接中將IP地址解析出來。一旦新連接建立起來并被接受,服務(wù)器就會將新連接添加到其現(xiàn)存Web服務(wù)器連接列表中,做好監(jiān)視連接上數(shù)據(jù)傳輸?shù)臏?zhǔn)備。Web服務(wù)器可以隨意拒絕或立即關(guān)閉任意一條連接。有些Web服務(wù)器會因為客戶端IP地址或主機(jī)名是未認(rèn)證的,或者因為它是已知的惡意客戶端而關(guān)閉連接。Web服務(wù)器也可以使用其他識別技術(shù)。
客戶端主機(jī)名識別
可以用"反向域名解析"對大部分Web服務(wù)器進(jìn)行配置,以便將客戶端IP地址轉(zhuǎn)換成客戶端主機(jī)名。Web服務(wù)器可以將客戶端主機(jī)名用于詳細(xì)的訪問控制和日志記錄。但要注意的是,主機(jī)名查找可能會花費很長時間,這樣會降低Web事務(wù)處理的速度。很多大容量Web服務(wù)器要么會禁止主機(jī)名解析,要么只允許對特定內(nèi)容進(jìn)行解析。
確定客戶端用戶
有些Web服務(wù)器還支持IETF的ident協(xié)議。服務(wù)器可以通過ident協(xié)議找到發(fā)起HTTP連接的用戶名。這些信息對Web服務(wù)器的日志記錄特別有用——流行的通用日志格式(Common Log Format)的第二個字段中就包含了每條HTTP請求的ident用戶名。如果客戶端支持ident協(xié)議,就在TCP端口113上監(jiān)聽ident請求。
ident在組織內(nèi)部可以很好地工作,但出于多種原因,在公共因特網(wǎng)上并不能很好地工作,原因包括:
- 很多客戶端PC沒有運行ident識別協(xié)議守護(hù)進(jìn)程軟件;
- ident協(xié)議會使HTTP事務(wù)處理產(chǎn)生嚴(yán)重的時延;
- 很多防火墻不允許ident流量進(jìn)入;
- ident協(xié)議不安全,容易被偽造;
- ident協(xié)議也不支持虛擬IP地址;
- 暴露客戶端的用戶名還涉及隱私問題。
接收請求報文
連接上有數(shù)據(jù)到達(dá)時,Web服務(wù)器會從網(wǎng)絡(luò)連接中讀取數(shù)據(jù),并將請求報文中的內(nèi)容解析出來。解析請求報文時,Web服務(wù)器會不定期地從網(wǎng)絡(luò)上接收輸入數(shù)據(jù)。網(wǎng)絡(luò)連接可能隨時都會出現(xiàn)延遲。Web服務(wù)器需要從網(wǎng)絡(luò)中讀取數(shù)據(jù),將部分報文數(shù)據(jù)臨時存儲在內(nèi)存中,直到收到足以進(jìn)行解析的數(shù)據(jù)并理解其意義為止。
解析請求報文時,Web服務(wù)器會:
- 解析請求行,查找請求方法、指定的URI以及版本號,各項之 間由一個空格分隔,并以一個CRLF序列作為行的結(jié)束;
- 檢測到以CRLF結(jié)尾的、標(biāo)識首部結(jié)束的空行(如果有的話);
- 如果有的話(長度由Content-Length首部指定),讀取請求主體。
報文的內(nèi)部表示法
有些Web服務(wù)器還會用便于進(jìn)行報文操作的內(nèi)部數(shù)據(jù)結(jié)構(gòu)來存儲請求報文。比如,數(shù)據(jù)結(jié)構(gòu)中可能包含有指向請求報文中各個片段的指針及其長度,這樣就可以將這些首部存放在一個快速查詢表中,以便快速訪問特定首部的具體值了
連接的輸入/輸出處理結(jié)構(gòu)
高性能的Web服務(wù)器能夠同時支持?jǐn)?shù)千條連接。這些連接使得服務(wù)器可以與世界各地的客戶端進(jìn)行通信,每個客戶端都向服務(wù)器打開了一條或多條連接。某些連接可能在快速地向Web服務(wù)器發(fā)送請求,而其他一些連接則可能在慢慢發(fā)送,或者不經(jīng)常發(fā)送請求,還有一些可能是空閑的,安靜地等待著將來可能出現(xiàn)的動作。因為請求可能會在任意時刻到達(dá),所以Web服務(wù)器會不停地觀察有無新的Web請求。不同的Web服務(wù)器結(jié)構(gòu)會以不同的方式為請求服務(wù)。
- 單線程Web服務(wù)器:單線程的Web服務(wù)器一次只處理一個請求,直到其完成為止。一個事務(wù)處理結(jié)束之后,才去處理下一條連接。這種結(jié)構(gòu)易于實現(xiàn),但在處理過程中,所有其他連接都會被忽略。這樣會造成嚴(yán)重的性能問題,只適用于低負(fù)荷的服務(wù)器,以及診斷工具。
- 多進(jìn)程及多線程Web服務(wù)器:多進(jìn)程和多線程Web服務(wù)器用多個進(jìn)程,或更高效的線程同時對請求進(jìn)行處理。可以根據(jù)需要創(chuàng)建,或者預(yù)先創(chuàng)建一些線程/進(jìn)程。有些服務(wù)器會為每條連接 分配一個線程/進(jìn)程,但當(dāng)服務(wù)器同時要處理成百、上千,甚至數(shù)以萬計的連接 時,需要的進(jìn)程或線程數(shù)量可能會消耗太多的內(nèi)存或系統(tǒng)資源。因此,很多多線 程Web服務(wù)器都會對線程/進(jìn)程的最大數(shù)量進(jìn)行限制。
- 復(fù)用I/O的服務(wù)器:為了支持大量的連接,很多Web服務(wù)器都采用了復(fù)用結(jié)構(gòu)。在復(fù)用結(jié)構(gòu)中,要同時監(jiān)視所有連接上的活動。當(dāng)連接的狀態(tài)發(fā)生變化時(比如,有數(shù)據(jù)可用,或出現(xiàn)錯誤時),就對那條連接進(jìn)行少量的處理;處理結(jié)束之后,將連接返回到開放連接列表中,等待下一次狀態(tài)變化。只有在有事情可做時才會對連接進(jìn)行處理;在空閑連接上等待的時候并不會綁定線程和進(jìn)程。
- 復(fù)用的多線程Web服務(wù)器:有些系統(tǒng)會將多線程和復(fù)用功能結(jié)合在一起,以利用計算機(jī)平臺上的多個CPU。多個線程(通常是一個物理處理器)中的每一個都在觀察打開的連接(或打開的連接中的一個子集),并對每條連接執(zhí)行少量的任務(wù)。
處理請求
一旦Web服務(wù)器收到了請求,就可以根據(jù)方法、資源、首部和可選的主體部分來對請求進(jìn)行處理了。有些方法(比如POST)要求請求報文中必須帶有實體主體部分的數(shù)據(jù)。其他一些方法(比如OPTIONS)允許有請求的主體部分,也允許沒有。少數(shù)方法(比如GET)禁止在請求報文中包含實體的主體數(shù)據(jù)。
對資源的映射及訪問
Web服務(wù)器是資源服務(wù)器。它們負(fù)責(zé)發(fā)送預(yù)先創(chuàng)建好的內(nèi)容(比如HTML頁面或JPEG圖片),以及運行在服務(wù)器上的資源生成程序所產(chǎn)生的動態(tài)內(nèi)容。在Web服務(wù)器將內(nèi)容傳送給客戶端之前,要將請求報文中的URI映射為Web服務(wù) 器上適當(dāng)?shù)膬?nèi)容或內(nèi)容生成器,以識別出內(nèi)容的源頭。
文檔的根目錄
Web服務(wù)器支持各種不同類型的資源映射,但最簡單的資源映射形式就是用請求URI作為名字來訪問Web服務(wù)器文件系統(tǒng)中的文件。通常,Web服務(wù)器的文件系統(tǒng)中會有一個特殊的文件夾專門用于存放Web內(nèi)容。這個文件夾被稱為文檔的根目錄(document root)。Web服務(wù)器從請求報文中獲取URI,并將其附加在文檔根目錄的后面。
目錄列表
Web服務(wù)器可以接收對目錄URL的請求,其路徑可以解析為一個目錄,而不是文件。我們可以對大多數(shù)Web服務(wù)器進(jìn)行配置,使其在客戶端請求目錄URL時采取不同的動作。大多數(shù)Web服務(wù)器都會去查找目錄中一個名為"index.html"或"index.htm"的文件來代表此目錄。如果用戶請求的是一個目錄的URL,而且這個目錄中有一個名為"index.html"或"index.htm"的文件,服務(wù)器就會返回那個文件的內(nèi)容。
- 返回一個錯誤。
- 不返回目錄,返回一個特殊的默認(rèn)"索引文件"。
- 掃描目錄,返回一個包含目錄內(nèi)容的HTML頁面。
動態(tài)內(nèi)容資源的映射
Web服務(wù)器還可以將URI映射為動態(tài)資源——也就是說,映射到按需動態(tài)生成內(nèi)容的程序上去。實際上,有一大類名為應(yīng)用程序服務(wù)器的Web服務(wù)器會將Web服務(wù)器連接到復(fù)雜的后端應(yīng)用程序上去。Web服務(wù)器要能夠分辨出資源什么時候是動態(tài)的,動態(tài)內(nèi)容生成程序位于何處,以及如何運行那個程序。大多數(shù)Web服務(wù)器都提供了一些基本的機(jī)制以識別和映射動態(tài)資源。
CGI是早期出現(xiàn)的一種簡單、流行的服務(wù)端應(yīng)用程序執(zhí)行接口。現(xiàn)代的應(yīng)用程序服務(wù)器都有更強(qiáng)大更有效的服務(wù)端動態(tài)內(nèi)容支持機(jī)制,包括ASP(Active Server Page)和Java servlet。
服務(wù)器端包含項
很多Web服務(wù)器還提供了對服務(wù)器端包含項(SSI)的支持。如果某個資源被標(biāo)識為存在服務(wù)器端包含項,服務(wù)器就會在將其發(fā)送給客戶端之前對資源內(nèi)容進(jìn)行處理。要對內(nèi)容進(jìn)行掃描,以查找(通常包含在特定HTML注釋中的)特定的模板,這些模板可以是變量名,也可以是嵌入式腳本。可以用變量的值或可執(zhí)行腳本的輸出來取代特定的模板。這是創(chuàng)建動態(tài)內(nèi)容的一種簡便方式。
訪問控制
Web服務(wù)器還可以為特定資源進(jìn)行訪問控制。有請求到達(dá),要訪問受控資源時,Web服務(wù)器可以根據(jù)客戶端的IP地址進(jìn)行訪問控制,也可以要求輸入密碼來訪問資源。
構(gòu)建響應(yīng)
一旦Web服務(wù)器識別出了資源,就執(zhí)行請求方法中描述的動作,并返回響應(yīng)報文。響應(yīng)報文中包含有響應(yīng)狀態(tài)碼、響應(yīng)首部,如果生成了響應(yīng)主體的話,還包括響應(yīng)主體。
響應(yīng)實體
如果事務(wù)處理產(chǎn)生了響應(yīng)主體,就將內(nèi)容放在響應(yīng)報文中回送過去。
如果有響應(yīng)主體的話,響應(yīng)報文中通常包括:
- 描述了響應(yīng)主體MIME類型的Content-Type首部;
- 描述了響應(yīng)主體長度的Content-Length首部;
- 實際報文的主體內(nèi)容。
MIME類型
Web服務(wù)器要負(fù)責(zé)確定響應(yīng)主體的MIME類型。有很多配置服務(wù)器的方法可以將MIME類型與資源關(guān)聯(lián)起來。Web服務(wù)器可以用文件的擴(kuò)展名來說明MIME類型。Web服務(wù)器會為每個資源掃描一個包含了所有擴(kuò)展名的MIME類型的文件,以確定其MIME類型。還可以通過配置Web服務(wù)器,將特定的文件與MIME類型相關(guān)聯(lián)。
- 魔法分類:Web服務(wù)器可以掃描每個資源的內(nèi)容,并將其與一個已知模式表(被稱為魔法文件)進(jìn)行匹配,以決定每個文件的MIME類型。這樣做可能比較慢,但很方便,尤其是文件沒有標(biāo)準(zhǔn)擴(kuò)展名的時候。
- 顯式分類:可以對Web服務(wù)器進(jìn)行配置,使其不考慮文件的擴(kuò)展名或內(nèi)容,強(qiáng)制特定文件或目錄內(nèi)容擁有某個MIME類型。
- 類型協(xié)商:有些Web服務(wù)器經(jīng)過配置,可以以多種文檔格式來存儲資源。在這種情況下,可以配置Web服務(wù)器,使其可以通過與用戶的協(xié)商來決定使用哪種格式(及相關(guān)的 MIME 類型)"最好"。
重定向
Web服務(wù)器有時會返回重定向響應(yīng)而不是成功的報文。Web服務(wù)器可以將瀏覽器重定向到其他地方來執(zhí)行請求。重定向響應(yīng)由返回碼3XX說明。Location響應(yīng)首部包含了內(nèi)容的新地址或優(yōu)選地址的URI。
重定向可用于下列情況。
- 永久搬離的資源:資源可能已經(jīng)被移動到了新的位置,或者被重新命名,有了一個新的URL。Web服務(wù)器可以告訴客戶端資源已經(jīng)被重命名了,這樣客戶端就可以在從新地址獲取資源之前,更新書簽之類的信息了。狀態(tài)碼"301 Moved Permanently"就用于此類重定向。
- 臨時搬離的資源:如果資源被臨時移走或重命名了,服務(wù)器可能希望將客戶端重定向到新的位置上去。但由于重命名是臨時的,所以服務(wù)器希望客戶端將來還可以回頭去使用老的URL,不要對書簽進(jìn)行更新。狀態(tài)碼"303 See Other"以及狀態(tài)碼"307 Temporary Redirect"就用于此類重定向。
- URL 增強(qiáng):服務(wù)器通常用重定向來重寫URL,往往用于嵌入上下文。當(dāng)請求到達(dá)時,服務(wù)器會生成一個新的包含了嵌入式狀態(tài)信息的URL,并將用戶重定向到這個新的URL上去。客戶端會跟隨這個重定向信息,重新發(fā)起請求,但這次的請求會包含完整的、經(jīng)過狀態(tài)增強(qiáng)的URL。這是在事務(wù)間維護(hù)狀態(tài)的一種有效方式。狀態(tài)碼"303 See Other"和"307 Temporary Redirect"用于此類重定向。
- 負(fù)載均衡:如果一個超載的服務(wù)器收到一條請求,服務(wù)器可以將客戶端重定向到一個負(fù)載不太重的服務(wù)器上去。狀態(tài)碼"303 See Other"和"307 Temporary Redirect"可用于此類重定向。
- 服務(wù)器關(guān)聯(lián):Web服務(wù)器上可能會有某些用戶的本地信息;服務(wù)器可以將客戶端重定向到包含了那個客戶端信息的服務(wù)器上去。狀態(tài)碼"303 See Other"和"307 Temporary Redirect"可用于此類重定向。
- 規(guī)范目錄名稱:客戶端請求的URI是一個不帶尾部斜線的目錄名時,大多數(shù)Web服務(wù)器都會將客戶端重定向到一個加了斜線的URI上,這樣相對鏈接就可以正常工作了。
發(fā)送響應(yīng)
Web服務(wù)器通過連接發(fā)送數(shù)據(jù)時也會面臨與接收數(shù)據(jù)一樣的問題。服務(wù)器可能有很多條到各個客戶端的連接,有些是空閑的,有些在向服務(wù)器發(fā)送數(shù)據(jù),還有一些在向客戶端回送響應(yīng)數(shù)據(jù)。服務(wù)器要記錄連接的狀態(tài),還要特別注意對持久連接的處理。對非持久連接而言,服務(wù)器應(yīng)該在發(fā)送了整條報文之后,關(guān)閉自己這一端的連接。對持久連接來說,連接可能仍保持打開狀態(tài),在這種情況下,服務(wù)器要特別小心,要正確地計算Content-Length首部,不然客戶端就無法知道響應(yīng)什么時候結(jié)束了。
記錄事務(wù)處理過程
最后,當(dāng)事務(wù)結(jié)束時,Web服務(wù)器會在日志文件中添加一個條目,來描述已執(zhí)行的事務(wù)。
轉(zhuǎn)載于:https://juejin.im/post/5bd0361951882577c758d321
總結(jié)
以上是生活随笔為你收集整理的HTTP权威指南记录 ---- Web服务器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB指定类型查询数据
- 下一篇: java操作ad域 免证书