Web服務器工作原理詳解(基礎篇)


概述: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服務器工作基本原理。其實不難發現,這僅僅只是一個簡單的網絡通信。我們應該深信,作為一個服務器,其根本的工作無非有三個

  1. 接收數據 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. 服務端產生
      (1) 用戶POST提交數據到某個程序,程序根據該數據作為參數運行,得出結果並裝入靜態的模板頁面中,返回該靜態頁面。但對於用戶來說,同一個頁面,做了一個操作后數據不一樣了。好了,這就是動態頁面。(CGI原理)
      (2) PHP的原理是,用戶GET請求一個php后綴的文件,服務器先執行該php后綴文件中的PHP代碼,將結果填入代碼的位置,再返回。當然也可以提交數據參與運算再返回。
    2. 客戶端產生
      (1) 用戶GET請求一個JavaScript文件,服務端不做任何運算返回該靜態文件。瀏覽器收到該JS文件,在本地執行並更新頁面。
      (2) 用戶POST提交數據到服務端,服務端根據該提交的數據指令返回靜態文件,瀏覽器收到后執行並更新。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM