1. 程式人生 > >Nginx的工作原理

Nginx的工作原理

 在正式運營環境下,部署Nginx時都是使用一個master程序來管理多個worker程序,一般情況下,worker程序的數量與伺服器上的CPU核心數相等。每一個worker程序都是繁忙的,它們在真正地提供網際網路服務,master程序則很“清閒”,只負責監控管理worker程序。worker程序之間通過共享記憶體、原子操作等一些程序間通訊機制來實現負載均衡等功能

Nginx是支援單程序(master程序)提供服務的,那麼為什麼運營環境下要按照master-worker方式配置同時啟動多個程序呢?這樣做的好處主要有以下兩點:

由於master程序不會對使用者請求提供服務,只用於管理真正提供服務的worker程序,所以master程序可以是唯一的,它僅專注於自己的純管理工作,為管理員提供命令列服務,包括諸如啟動服務、停止服務、過載配置檔案、平滑升級程式等。master程序需要擁有較大的許可權,例如,通常會利用root使用者啟動master程序。worker程序的許可權要小於或等於master程序,這樣master程序才可以完全地管理worker程序。當任意一個worker程序出現錯誤從而導致coredump時,master程序會立刻啟動新的worker程序繼續服務。

   多個worker程序處理網際網路請求不但可以提高服務的健壯性(一個worker程序出錯後,其他worker程序仍然可以正常提供服務),最重要的是,這樣可以充分利用現在常見的SMP多核架構,從而實現微觀上真正的多核併發處理。因此,用一個程序(master程序)來處理網際網路請求肯定是不合適的。另外,為什麼要把worker程序數量設定得與CPU核心數量一致呢?這正是Nginx與Apache伺服器的不同之處。在Apache上每個程序在一個時刻只處理一個請求,因此,如果希望Web伺服器擁有併發處理的請求數更多,就要把Apache的程序或執行緒數設定得更多,通常會達到一臺伺服器擁有幾百個工作程序,這樣大量的程序間切換將帶來無謂的系統資源消耗。而Nginx則不然,一個worker程序可以同時處理的請求數只受限於記憶體大小,而且在架構設計上,不同的worker程序之間處理併發請求時幾乎沒有同步鎖的限制,worker程序通常不會進入睡眠狀態,因此,當Nginx上的程序數與CPU核心數相等時(最好每一個worker程序都繫結特定的CPU核心),程序間切換的代價是最小的。整個工作過程如下圖所示:

 

 

 

 

 

非同步非阻塞即為nginx的工作原理,即master負載work程序,work程序負責httpd請求處理