Nginx學習之五 nginx基礎架構設計

2021-06-25 14:03:31 字數 1869 閱讀 4610

一、優秀的模組化設計

(1)高度抽象的模組介面

所有的模組都遵循著同樣的ngx_module_t介面設計規範。

(2)模組介面簡單,靈活性高

模組的基本介面ngx_module_t足夠簡單,只涉及模組的初始化、退出以及對配置項的處理,這同時帶來了足夠的靈活性,是的nginx比較簡單的實現了動態可修改性,也就是保持服務正常執行下使得系統功能發生改變。

102 struct ngx_module_s ;
上述**中void*型別的成員ctx一般用於表示在不同型別的模組中一種型別模組所具備的通用性幾介面。

(3)多層次、多類別的模組設計

nginx常用模組機器之間的關係:

可以注意到,ngx_module_t介面中有乙個type成員,指明了nginx允許在設計模組時定義模組型別這個概念。

配置模組的型別是ngx_conf_module,僅有乙個模組。配置模組是所有模組的基礎,它實現了最基本的配置項的解析功能(就是解析nginx.conf檔案)。

nginx定義了一種基礎型別的模組:核心模組,模組型別是ngx_core_module。定義核心模組的目的是使得非模組化的框架**只關注與如何呼叫6個核心模組。

事件模組、http模組、mail模組這三種模組的共性是:實際上它們在核心模組中各有1個模組作為自己的代言人,並在同類模組中有1個作為核心業務與管理功能的模組。

事件模組是http模組和mail模組的基礎。

二、事件驅動架構

nginx採用完全的事件驅動架構來處理業務,這與傳統的web伺服器(如apache)是不同的。

對於傳統web伺服器而言,採用的所謂事件驅動往往侷限在tcp連線建立、關閉事件上。乙個連線建立後,在其關閉之前的所有操作都不再是事件驅動,這時會退化成按序執行每個操作的批處理模式,這樣每個請求在連線建立後都將始終占用著系統資源,直到連線關閉後才會釋放資源。

這種傳統的web伺服器往往把乙個程序或執行緒作為事件消費者,當乙個請求產生的事件被該程序處理時,直到這個請求處理結束時程序資源都將被這乙個請求所占用。

nginx則不然,不會使用程序或執行緒來作為事件消費者,所謂的事件消費者只能是某個模組(在這裡沒有程序的概念)。只有事件收集、分發器才有資格占用程序資源,它們會在分發某個事件時呼叫事件消費模組使用當前占用的資源。

nginx處理事件的簡單模型如下圖:

從上面的內容可一看出傳統web伺服器與nginx之間的重要差別:前者是每個事件消費者獨佔乙個程序資源,後者的事件消費者只是被事件分發者短期呼叫而已。這種設計使得網路效能、使用者感知的請求時延都得到提公升,每個使用者的請求都所產生的事件都得到及時響應,整個伺服器的網路吞吐量都會由於事件的及時響應而增大。但這也會帶來乙個問題:事件消費者都不能有阻塞行為,否則由於長時間占用事件分發者程序而導致其它事件得不到及時響應。

三、請求的多階段非同步處理

請求的多階段非同步處理是基於事件(也只能基於事件)驅動架構實現。就是把乙個請求的處理過程按照事件的觸發方式分為多個節點,每個階段都由事件收集、分發器來觸發。

其優勢:

這種設計配合事件驅動架構,將極大地提高網路的效能,同時使得每個程序全力運轉,不會或者盡量少的出現程序休眠狀況。因為一旦出現程序休眠,必然減少併發處理事件的數目,一定會降低網路效能,同時會增加請求處理時間的平均時延。這時,網路效能無法滿足業務需求將只能增加程序數目,程序數目過多就會增加作業系統核心的額外操作:程序間切換。頻繁的程序切換仍會消耗cpu等資源,從而降低網路效能。同時,休眠的程序會使程序占用的記憶體得不到有效釋放,這最終必然導致系統可用記憶體的下降,從而影響系統能夠處理的最大併發連線數。

nginx學習篇(五)利用nginx實現附加功能

問題由來 瀏覽器拒絕執行其它網域名稱下的ajax運作 修改內容 這裡我本地模擬了ajax請求我的nginx伺服器獲得的頁面是 但是按住按鈕並不能載入出nginx返回的資料,而正常訪問nginx卻可以獲取資料 這是因為chrome拒絕執行ajax請求得到的返回值 此問題常見解決方案 1 最常用的是,j...

Nginx學習筆記(五 Nginx快取與限流)

顧名思義,nginx快取就是nginx在接受到 伺服器的資料後,根據cache的配置將這樣寫資料快取到本地硬碟。當客戶端下次訪問相同資料時,nginx伺服器直接從硬碟檢索到響應的資料給客戶,從而減少於被 伺服器互動的時間。proxy cache path 快取檔案的存放路徑。proxy cache ...

nginx學習(五) http模組

一 http核心模組 1 alias 語法 alias file path directory path 預設值 no 作用域 location 該指令設定指定location使用的路徑.注意它跟 root 相似,但是不改變檔案的根路徑,僅僅是使用檔案系統路徑 比如 location i 請求 i ...