標籤:http伺服器 http協議 web服務
對於沒有做過web開發的人來說,web開發涉及到的名詞似乎特別多,apache,nginx,cgi,php,http,cookie,session。這一大坨東西到底是什麼,這裡我們就從網路的層面去理清楚這些東西。
1. 什麼是HTTP
對於web來說貫穿始終的東西就是HTTP,那麼什麼是HTTP?官方說法就是Hyper Text Transfer Protocol,從這個名字上面還判斷,HTTP是一種協議,並且是一種應用程式層協議,其對應的傳輸層協議TCP。所以說到底,HTTP就是建立在TCP基礎上的一種應用程式層協議。
對於伺服器來說,是一個被動串連的過程,所以一般是由用戶端發起tcp串連請求,並發送資料,由於tcp流無邊界的特點,必須約定一種協議來判斷資料的結尾,http規定的協議格式如下:
所以對於一個http server來說,只需要按照上述報文格式來收包解包就可以了。
2. 什麼是COOKIE/SESSION
先說cookie,其由瀏覽器來進行管理,所以通過js可以對其進行修改。其一般儲存在用戶端記憶體中,所以生命週期為瀏覽器會話期間,關閉瀏覽器以後,cookie會自動消失。當然如果cookie設定了到期時間,也會由瀏覽器同步在磁碟當中。在每次http請求的過程當中,瀏覽器會在後台選擇一部分cookie放在http包頭當中發給web伺服器。所以cookie過長導致的直接結果就是http包體過大,因此http協議對cookie的長度是有限制的。
而session可以看做是伺服器端的一個hash表,預設是以檔案的形式儲存的,key就是session id,session id會儲存在cookie當中,所以每次伺服器解開http包以後,根據cookie中的session id就可以在hash表中資料。那麼問題就來了,如果使用者在瀏覽器禁掉了cookie,是不是就找不到session了呢?當然不是,僅僅是禁掉cookie還有很多其他的方式可以將其拼在http包當中傳回來呀,可以放在包頭的其他欄位裡比如說get參數,也可以放在包體當中,例如post參數,這種事情是不能難倒程式員的
3. 什麼是Apache和Nginx
如果他們作為http server(當然還有其他的feature),比較簡單地理解就是他們是對http協議的一種實現,即解包->過濾->轉包->過濾->回包,是nginx的一個簡要。
4. 一般的web架構是怎樣的
是一個常見的web架構,由反向 Proxy伺服器,http伺服器組成,http伺服器又分成nginx進程和php進程,任何一個環節出現問題都可能導致瀏覽器的錯誤頁面。
首先,暴露給使用者的是一個反向 Proxy伺服器,反向 Proxy的存在有幾個作用,一是負載平衡,反向 Proxy伺服器收到資料包以後會按照一定的負載平衡演算法轉寄到真正的商務服務器上面去,另一個作用是防止攻擊,它會按照一定的規則過濾掉很多不合法的請求,從而降低業務機的負載,因為其只是簡單地轉寄,沒有真正的商務邏輯,所以即使駭客攻擊到了這一層也沒有太大的危害。同時反向 Proxy伺服器也可以緩衝一些靜態資源,進一步降低業務機的負載。
nginx作為http伺服器,在整個架構中主要負責hold串連,並不做請求的真正處理,在中被畫成了一個方塊,但其本身也是多進程的結構。
加入對同一台機器上面配置了8個nginx worker,每個worker配置的串連數是1024,那麼這台機器hold串連的能力就是8*1024。
nginx worker和php-fpm的通訊方式是通過socket來通訊的,所以說nginx和php-fpm可以部署在同一台機器上也可以部署在不同的機器上。現在資料被轉寄給了php-fpm,其結構和nginx基本類似。php-fpm是php的一個外掛程式,現在已經整合到了php的核心代碼中,是fast-cgi的一種實現。fastcgi規定每過來一個請求,都從進程池裡挑選一個進程,來載入並執行一段php指令碼,指令碼結束以後將進城歸還給進程池。所以php-fpm說到底就是一個進程管理器,正如其名字所示(FastCGI Process Manager)。我們可以看到在fastcgi模式下,一個進程是對應一個請求的,假如說在一台機器上我們配置了300個fastcgi進程,那麼其能同時處理的最大請求數就是300個,是遠遠小於nginx的接入能力的。如果php有一些阻塞調用,當前進程不能非同步處理其他的請求,所以說php-fpm在在這套架構裡是瓶頸。
深入淺出web服務