Nginx架構設計

後開啟撒打發了發表於2018-01-29

Nginx架構設計


這裡先說下Nginx設計時重視的幾個關鍵點:
  • 效能:包括網路效能,單詞請求的延遲性,網路效率;(名詞就不解釋了~)
  • 可伸縮性:可通過新增元件來提升服務,或者允許元件之間具有互動功能;
  • 簡單性:元件的簡單程度,便於理解和實現;
  • 可修改性:包括可進化性,可擴充套件性,可定製性,可配置性,可重用性;
  • 可見性:可監控關鍵元件的執行情況;
  • 可移植性:跨平臺執行;
  • 可靠性:在服務出現故障時,一個架構容易受到系統層面故障影響的程度;

模組化設計

高度模組化的設計是Nginx的架構基礎。在Nginx中,除了少量的核心程式碼,其他一切皆為模組。這一點在之前的模組開發的實踐中已經感受到了。

所有模組都遵循ngx_module_t的介面設計,並且所有模組間都是分層次、分類別的。

官方Nginx共有五大型別模組:核心模組、配置模組、事件模組、HTTP模組、mail模組

它們都各具備相同的ngx_module_t介面,但在請求處理流程中的層次不相同。

Nginx常用模組間的關係如下圖:


配置模組與核心模組由Nginx的框架程式碼定義。其中,配置模組是所有模組的基礎,它實現最基本的解析功能(即解析nginx.conf檔案)。然後,Nginx框架會呼叫核心模組,其他三種模組則不會與框架產生直接關係。如上圖示,事件模組、HTTP模組、mail模組在核心模組中分別都有一個自己的“代言人”,並在同類模組中有一個作為核心業務與管理功能的模組。比如,事件模組由其代言人ngx_events_module核心模組定義,但所有事件模組載入又由ngx_event_core_module負責。

在上圖中,配置模組與核心模組都是與Nginx框架密切相關的,是其他模組的基礎。而事件模組又是HTTP模組和mail模組的接觸。HTTP模組與mail模組更關注於應用層面,地位相似。


事件驅動架構


事件驅動架構,簡單來生活,就是由一些時間發生源產生事件,由一個或多個事件收集器來收集、分發時間,然後許多時間處理器會註冊自己感興趣的事件,同時會“消費”這些事件。

Nginx採用完全的事件驅動架構來處理業務,與傳統的Web伺服器不同。區別用圖示:
  • 傳統Web伺服器處理事件模型
         

  • Nginx處理事件模型
        

兩者最重要差別:傳統Web伺服器是每個事件消費者獨佔一個程式資源,Nginx的事件消費者只是被事件分發程式短期呼叫。

這樣的設計使得網路效能、使用者感知的請求延時得到提升。但同時帶來的一個弊端:每個時間消費者不能有阻塞行為,否則會由於長時間佔用分發者程式而導致其他事件得不到響應。更進一步說,就是不能讓分發者程式轉為休眠或等待狀態。

相關文章