Web服務器會對HTTP請求進行處理並提供響應。術語"Web服務器"能夠用來表示Web服務器的軟件,也能夠用來表示提供Web頁面的特定設備或計算機。
html
Web服務器實現了HTTP和相關的TCP鏈接處理。負責管理Web服務器提供的資源,以及對Web服務器的配置、控制及擴展方面的管理。Web服務器邏輯實現了HTTP協議、管理着Web 資源,並負責提供We 服務器的管理功能。Web服務器邏輯和操做系統共同負責管理TCP鏈接。底層操做系統負責管理底層計算機系統的硬件細節,並提供了TCP/IP網絡支持、負責裝載Web資源的文件系統以及控制當前計算活動的進程管理功能。
後端
Web 服務器有各類不一樣的形式。
瀏覽器
若是客戶端已經打開了一條到服務器的持久鏈接,可使用那條鏈接來發送它的請求。不然,客戶端須要打開一條新的到服務器的鏈接。
安全
客戶端請求一條到Web服務器的TCP鏈接時,Web服務器會創建鏈接,判斷鏈接的另外一端是哪一個客戶端,從TCP鏈接中將IP地址解析出來。一旦新鏈接創建起來並被接受,服務器就會將新鏈接添加到其現存Web服務器鏈接列表中,作好監視鏈接上數據傳輸的準備。Web服務器能夠隨意拒絕或當即關閉任意一條鏈接。有些Web服務器會由於客戶端IP地址或主機名是未認證的,或者由於它是已知的惡意客戶端而關閉鏈接。Web服務器也可使用其餘識別技術。
服務器
能夠用"反向域名解析"對大部分Web服務器進行配置,以便將客戶端IP地址轉換成客戶端主機名。Web服務器能夠將客戶端主機名用於詳細的訪問控制和日誌記錄。但要注意的是,主機名查找可能會花費很長時間,這樣會下降Web事務處理的速度。不少大容量Web服務器要麼會禁止主機名解析,要麼只容許對特定內容進行解析。
網絡
有些Web服務器還支持IETF的ident協議。服務器能夠經過ident協議找到發起HTTP鏈接的用戶名。這些信息對Web服務器的日誌記錄特別有用——流行的通用日誌格式(Common Log Format)的第二個字段中就包含了每條HTTP請求的ident用戶名。若是客戶端支持ident協議,就在TCP端口113上監聽ident請求。
數據結構
ident在組織內部能夠很好地工做,但出於多種緣由,在公共因特網上並不能很好地工做,緣由包括:
多線程
鏈接上有數據到達時,Web服務器會從網絡鏈接中讀取數據,並將請求報文中的內容解析出來。解析請求報文時,Web服務器會不按期地從網絡上接收輸入數據。網絡鏈接可能隨時都會出現延遲。Web服務器須要從網絡中讀取數據,將部分報文數據臨時存儲在內存中,直到收到足以進行解析的數據並理解其意義爲止。
負載均衡
解析請求報文時,Web服務器會:
ide
有些Web服務器還會用便於進行報文操做的內部數據結構來存儲請求報文。好比,數據結構中可能包含有指向請求報文中各個片斷的指針及其長度,這樣就能夠將這些首部存放在一個快速查詢表中,以便快速訪問特定首部的具體值了
高性能的Web服務器可以同時支持數千條鏈接。這些鏈接使得服務器能夠與世界各地的客戶端進行通訊,每一個客戶端都向服務器打開了一條或多條鏈接。某些鏈接可能在快速地向Web服務器發送請求,而其餘一些鏈接則可能在慢慢發送,或者不常常發送請求,還有一些多是空閒的,安靜地等待着未來可能出現的動做。由於請求可能會在任意時刻到達,因此Web服務器會不停地觀察有無新的Web請求。不一樣的Web服務器結構會以不一樣的方式爲請求服務。
一旦Web服務器收到了請求,就能夠根據方法、資源、首部和可選的主體部分來對請求進行處理了。有些方法(好比POST)要求請求報文中必須帶有實體主體部分的數據。其餘一些方法(好比OPTIONS)容許有請求的主體部分,也容許沒有。少數方法(好比GET)禁止在請求報文中包含實體的主體數據。
Web服務器是資源服務器。它們負責發送預先建立好的內容(好比HTML頁面或JPEG圖片),以及運行在服務器上的資源生成程序所產生的動態內容。在Web服務器將內容傳送給客戶端以前,要將請求報文中的URI映射爲Web服務 器上適當的內容或內容生成器,以識別出內容的源頭。
Web服務器支持各類不一樣類型的資源映射,但最簡單的資源映射形式就是用請求URI做爲名字來訪問Web服務器文件系統中的文件。一般,Web服務器的文件系統中會有一個特殊的文件夾專門用於存放Web內容。這個文件夾被稱爲文檔的根目錄(document root)。Web服務器從請求報文中獲取URI,並將其附加在文檔根目錄的後面。
Web服務器能夠接收對目錄URL的請求,其路徑能夠解析爲一個目錄,而不是文件。咱們能夠對大多數Web服務器進行配置,使其在客戶端請求目錄URL時採起不一樣的動做。大多數Web服務器都會去查找目錄中一個名爲"index.html"或"index.htm"的文件來表明此目錄。若是用戶請求的是一個目錄的URL,並且這個目錄中有一個名爲"index.html"或"index.htm"的文件,服務器就會返回那個文件的內容。
Web服務器還能夠將URI映射爲動態資源——也就是說,映射到按需動態生成內容的程序上去。實際上,有一大類名爲應用程序服務器的Web服務器會將Web服務器鏈接到複雜的後端應用程序上去。Web服務器要可以分辨出資源何時是動態的,動態內容生成程序位於何處,以及如何運行那個程序。大多數Web服務器都提供了一些基本的機制以識別和映射動態資源。
CGI是早期出現的一種簡單、流行的服務端應用程序執行接口。現代的應用程序服務器都有更強大更有效的服務端動態內容支持機制,包括ASP(Active Server Page)和Java servlet。
不少Web服務器還提供了對服務器端包含項(SSI)的支持。若是某個資源被標識爲存在服務器端包含項,服務器就會在將其發送給客戶端以前對資源內容進行處理。要對內容進行掃描,以查找(一般包含在特定HTML註釋中的)特定的模板,這些模板能夠是變量名,也能夠是嵌入式腳本。能夠用變量的值或可執行腳本的輸出來取代特定的模板。這是建立動態內容的一種簡便方式。
Web服務器還能夠爲特定資源進行訪問控制。有請求到達,要訪問受控資源時,Web服務器能夠根據客戶端的IP地址進行訪問控制,也能夠要求輸入密碼來訪問資源。
一旦Web服務器識別出了資源,就執行請求方法中描述的動做,並返回響應報文。響應報文中包含有響應狀態碼、響應首部,若是生成了響應主體的話,還包括響應主體。
若是事務處理產生了響應主體,就將內容放在響應報文中回送過去。
若是有響應主體的話,響應報文中一般包括:
Web服務器要負責肯定響應主體的MIME類型。有不少配置服務器的方法能夠將MIME類型與資源關聯起來。Web服務器能夠用文件的擴展名來講明MIME類型。Web服務器會爲每一個資源掃描一個包含了全部擴展名的MIME類型的文件,以肯定其MIME類型。還能夠經過配置Web服務器,將特定的文件與MIME類型相關聯。
Web服務器有時會返回重定向響應而不是成功的報文。Web服務器能夠將瀏覽器重定向到其餘地方來執行請求。重定向響應由返回碼3XX說明。Location響應首部包含了內容的新地址或優選地址的URI。
重定向可用於下列狀況。
Web服務器經過鏈接發送數據時也會面臨與接收數據同樣的問題。服務器可能有不少條到各個客戶端的鏈接,有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄鏈接的狀態,還要特別注意對持久鏈接的處理。對非持久鏈接而言,服務器應該在發送了整條報文以後,關閉本身這一端的鏈接。對持久鏈接來講,鏈接可能仍保持打開狀態,在這種狀況下,服務器要特別當心,要正確地計算Content-Length首部,否則客戶端就沒法知道響應何時結束了。
最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務。