nginx 的模塊及處理流程


     nginx的內部結構是由核心部分和一系列的功能模塊所組成。這樣划分是為了使得每個模塊的功能相對簡單,便於開發,同時也便於對系統進行功能擴展。這樣的模塊化設計類似於面向對象中的接口類,它增強了nginx源碼的可讀性、可擴充性和可維護性。

nginx的4種角色模塊

Nginx模塊主要有4種角色:
    (1) core(核心模塊):構建nginx基礎服務、管理其他模塊。
    (2) handlers(處理模塊): 用於處理HTTP請求,然后產生輸出。
    (3) filters(過濾模塊): 過濾handler產生的輸出。
    (4) load-balancers(負載均衡模塊):當有多於一台的后端備選服務器時,選擇一台轉發HTTP請求。

Nginx的核心模塊主要負責建立nginx服務模型、管理網絡層和應用層協議、以及啟動針對特定應用的一系列候選模塊。

其他模塊負責分配給web服務器的實際工作:

  • 當Nginx發送文件或者轉發請求到其他服務器,由handlers(處理模塊)或load-balancers(負載均衡模塊)提供服務;
  • 當需要Nginx把輸出壓縮或者在服務端加一些東西,由filters(過濾模塊) 提供服務。
     

模塊是如何被調用的?

當服務器啟動,每個handlers(處理模塊)都有機會映射到配置文件中定義的特定位置(location);
如果有多個handlers(處理模塊)映射到特定位置時,只有一個會“贏”(說明配置文件有沖突項,應該避免發生)。
處理模塊以三種形式返回:

  • OK、
  • ERROR、
  • 或者放棄處理這個請求而讓默認處理模塊來處理(主要是用來處理一些靜態文件,事實上如果是位置正確而真實的靜態文件,默認的處理模塊會搶先處理)。


如果handlers(處理模塊)把請求反向代理到后端的服務器,就變成另外一類的模塊:load-balancers(負載均衡模塊)。
負載均衡模塊的配置中有一組后端服務器,當一個HTTP請求過來時,它決定哪台服務器應當獲得這個請求。
Nginx的負載均衡模塊采用兩種方法:

  • 輪轉法,它處理請求就像紙牌游戲一樣從頭到尾分發;
  • IP哈希法,在眾多請求的情況下,它確保來自同一個IP的請求會分發到相同的后端服務器。


如果handlers(處理模塊)沒有產生錯誤,filters(過濾模塊)將被調用。
多個filters(過濾模塊)能映射到每個位置,所以(比如)每個請求都可以被壓縮成塊。它們的執行順序在編譯時決定。
filters(過濾模塊)是經典的“接力鏈表(CHAIN OF RESPONSIBILITY)”模型:一個filters(過濾模塊)被調用,完成其工作,然后調用下一個filters(過濾模塊),直到最后一個filters(過濾模塊)。Nginx完成這個回復。
過濾模塊鏈的特別之處在於,

  • 每個filters(過濾模塊)不會等上一個filters(過濾模塊)全部完成;
  • 它能把前一個過濾模塊的輸出作為其處理內容;有點像Unix中的流水線。

過濾模塊能以buffer(緩沖區)為單位進行操作,這些buffer一般都是一頁(4K)大小,當然你也可以在nginx.conf文件中進行配置。這意味着,比如,模塊可以壓縮來自后端服務器的回復,然后像流一樣的到達客戶端,直到整個回復發送完成。
總之,過濾模塊鏈以流水線的方式高效率地向客戶端發送響應信息。

nginx模塊處理流程


  所以總結下上面的內容,一個典型的處理周期是這樣的:
  客戶端發送HTTP請求 –> Nginx基於配置文件中的位置選擇一個合適的處理模塊 ->(如果有)負載均衡模塊選擇一台后端服務器 –> 處理模塊進行處理並把輸出緩沖放到第一個過濾模塊上 –> 第一個過濾模塊處理后輸出給第二個過濾模塊 –> 然后第二個過濾模塊又到第三個 –> 依此類推 –> 最后把回復發給客戶端。   

下圖展示了nginx模塊處理流程。

28235112-304f50f64d424af1972af24a2383c4cf

 

 

 

參考資料:

結合源碼看nginx-1.4.0之nginx模塊組織結構詳解
http://www.cnblogs.com/didiaoxiong/p/3209767.html


免責聲明!

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



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