概述:Web服務器概念較為廣泛,我們最常說的Web服務器指的是網站服務器,它是建立在Internet之上並且駐留在某種計算機上的程序。Web服務器可以向Web客戶端(如瀏覽器)提供文檔或其他服務,只要是遵循HTTP協議而設計的網絡應用程序都可以是Web客戶端。
Web服務器和HTTP服務器可以說是同一個東西,當然非得細分的話,HTTP服務器是建立在HTTP協議之上的提供文檔瀏覽的服務器,更多的是提供靜態的文件。而Web服務器涵蓋了HTTP服務器(這一點可以自行百度百科), Web服務器不僅能夠存儲信息,還能在用戶通過Web瀏覽器提供的信息的基礎上運行腳本和程序。
Web服務器 約等於 HTTP服務器 + 其他服務
目前所熟知的Web服務器有很多,其最主流的是 Apache, Nginx, IIS
各大Web服務器的實現細節都不同,是為了某種情形而設計開發的。但是它們的基礎工作原理是相同的,這也是本次基礎篇所講解的內容。
一、Web服務器工作原理圖解
首先我們暫時不考慮HTTP協議的各種請求方式,我們先跟着**(Web服務器工作原理總體描述01)這張圖,將一次Web服務的工作流程過一遍,我們假設以瀏覽器作為客戶端
(1) 用戶做出了一個操作,可以是填寫網址敲回車,可以是點擊鏈接,可以是點擊按鍵等,接着瀏覽器獲取了該事件。
(2) 瀏覽器與對端服務程序建立TCP連接。
(3) 瀏覽器將用戶的事件按照HTTP協議格式**打包成一個數據包,其實質就是在待發送緩沖區中的一段有着HTTP協議格式的字節流。
(4) 瀏覽器確認對端可寫,並將該數據包推入Internet,該包經過網絡最終遞交到對端服務程序。
(5) 服務端程序拿到該數據包后,同樣以HTTP協議格式解包,然后解析客戶端的意圖。
(6) 得知客戶端意圖后,進行分類處理,或是提供某種文件、或是處理數據。
(7) 將結果裝入緩沖區,或是HTML文件、或是一張圖片等。
(8) 按照HTTP協議格式將(7)中的數據打包
(9) 服務器確認對端可寫,並將該數據包推入Internet,該包經過網絡最終遞交到客戶端。
(10) 瀏覽器拿到包后,以HTTP協議格式解包,然后解析數據,假設是HTML文件。
(11) 瀏覽器將HTML文件展示在頁面
以上為Web服務器工作基本原理。其實不難發現,這僅僅只是一個簡單的網絡通信。我們應該深信,作為一個服務器,其根本的工作無非有三個
- 接收數據 2. 發送數據 3. 數據處理
而Web服務器的本質就是 接收數據 ⇒ HTTP解析 ⇒ 邏輯處理 ⇒ HTTP封包 ⇒ 發送數據
高級的服務器無非就是將這三個部分更加細致的設計了。
二、Web服務器之提供靜態文件工作原理圖解
Web服務器最主要的功能是提供靜態的文件。日常的上網瀏覽大多是網頁瀏覽,少數時候才會有一些數據的提交操作。因此,我們結合上一張圖示來重點講解在GET請求下的Web服務器工作原理。
其他流程基本不變,着重在於紅色與藍色部分。
(1) 當用戶點擊一個網頁鏈接或瀏覽器加載一些資源(css,jpg …)時產生。
(6) 服務程序解包后,確定其為GET請求,並且是對該服務器上的某一資源的請求。首先服務程序會去確認該路徑是否存在,再確定該路徑的文件是否可以獲取。
(7-1) 如果請求的路徑有誤,或者該資源不能被用戶獲取,則返回錯誤提示頁面。很多服務器的錯誤頁面只有404,更專業的應該是將錯誤分類並返回對應的錯誤代碼頁面。
(7-2) 如果該路徑合法且文件可以被獲取,那么服務程序將根據該文件類型進行不同的裝載過程,記錄其類型作為(8)中HTTP協議中對應的返回類型,並加入響應頭。
假設以點擊一個頁面鏈接為例,瀏覽器首先將HTML文件請求過來,再以同樣的流程對HTML文件中包含的資源文件路徑進行依次請求。
三、Web服務器之數據提交工作原理圖解
僅僅只是網頁的瀏覽並不能滿足所有人的需求,客戶端與服務器應當是有數據交互的。
即使單方面的資源請求任然是網絡的主力軍。
我們應該清楚的知道,數據提交對於用戶來說有什么作用。
(1) 資源上傳 (2) 登陸驗證 (3) API接口調用 (4) 遠程指令等
數據提交使得用戶的操作性有了質的飛躍,它使得HTTP短連接獲取靜態文件的方式提升到了動態交互的層次上。該性質也催化出各式各樣的編程語言、框架。例如PHP,JavaWeb。
如果你留意目前主流的那些大型服務器,你會發現再高級再牛逼的東西實際是也是最基礎的東西建造的。那么我們還可以順便學習一下最古老的動態技術CGI
其他流程基本不變,着重在於紅色與藍色部分。
(1) 用戶提交數據,假設用戶點擊一個按鍵提交填好的信息。在(3)中將以POST格式寫入,並填入提交至服務端的可執行程序的路徑。
(6) 服務端將參數與該CGI綁定,復制進程,用管道傳遞參數和接收結果
(7) 子進程執行CGI,接收(6)父進程傳來的參數,運算完成返回結果。
最后父進程將結果裝入靜態模板文件,放入緩沖區
四、動態技術
我們得明白,Web服務器是以短連接為主,並且獲取的數據到達瀏覽器的那一刻一定是靜態的不變的。那么所謂動態實際是指兩種情況
- 服務端產生:
(1) 用戶POST提交數據到某個程序,程序根據該數據作為參數運行,得出結果並裝入靜態的模板頁面中,返回該靜態頁面。但對於用戶來說,同一個頁面,做了一個操作后數據不一樣了。好了,這就是動態頁面。(CGI原理)
(2) PHP的原理是,用戶GET請求一個php后綴的文件,服務器先執行該php后綴文件中的PHP代碼,將結果填入代碼的位置,再返回。當然也可以提交數據參與運算再返回。 - 客戶端產生:
(1) 用戶GET請求一個JavaScript文件,服務端不做任何運算返回該靜態文件。瀏覽器收到該JS文件,在本地執行並更新頁面。
(2) 用戶POST提交數據到服務端,服務端根據該提交的數據指令返回靜態文件,瀏覽器收到后執行並更新。