Nginx生態完善,功能齊全要歸功於它,優雅的模組化設計

今天是2021年11月14日,我們來學習Nginx的模組化設計。

大家知道Nginx之所以這麼多的特性,是因為有很多第三方開發者在為它提供不同功能的模組。Nginx的模組設計非常優良。Nginx主框架只提供了少量的核心程式碼,強大的功能是在各自模組中實現的,模組設計完全遵循高內聚,低耦合的原則。各型別的模組實現了統一的介面規範,這在一定程度上增強了Nginx的靈活性和可擴充套件性。這也是大家需要向Nginx學習的地方。

大家在官方文件

可以看到所有的官方模組都有較為完善的說明。

Nginx生態完善,功能齊全要歸功於它,優雅的模組化設計

大家點選進去就會看到該模組的各引數具體說明及配置:

Nginx生態完善,功能齊全要歸功於它,優雅的模組化設計

Nginx官方主要將模組按功能分為5類

核心模組

:Nginx裡最重要的一類模組,如:ngx_core_module等。

HTTP模組

:這類模組都是與處理HTTP請求相關的。由於Nginx主要用於處理HTTP請求,所以這類模組都數量遠超其他模組。

Event模組

:這部分主要是為了適配在不同作業系統、不同核心版本的事件驅動模組。Nginx支援主流的事件驅動。如:select,poll, epoll, kqueue,eventport等。

Mail模組

:從名字都能看得出來這是與郵件相關的模組。

配置模組

:此類模組只有ngx_conf_module一個成員,是別的模組的基礎,每個模組在生效前都要依賴配置模組處理配置從而完成自己的準備工作。

Nginx生態完善,功能齊全要歸功於它,優雅的模組化設計

Nginx模組分類

上面說了這些模組都實現了統一的介面規範。這個介面規範定義在ngx_module。h裡:

struct ngx_module_s { ngx_uint_t ctx_index; // 所屬分類標識。 ngx_uint_t index; // 模組的順序 char *name; // 模組名 ngx_uint_t version; const char *signature; void *ctx; // 上下文資訊 ngx_command_t *commands; // 模組指令集合的陣列 ngx_uint_t type; // 在不同時機下觸發回撥 (這裡是給第三方模組自由發揮的空間) ngx_int_t (*init_master)(ngx_log_t *log); ngx_int_t (*init_module)(ngx_cycle_t *cycle); ngx_int_t (*init_process)(ngx_cycle_t *cycle); ngx_int_t (*init_thread)(ngx_cycle_t *cycle); void (*exit_thread)(ngx_cycle_t *cycle); void (*exit_process)(ngx_cycle_t *cycle); void (*exit_master)(ngx_cycle_t *cycle);};

ngx_module_s這個結構體它包含了一個模組的基本資訊,包括模組名稱,模組型別,模組指令,模組順序等。可以看到init_master、init_module、init_process等7個鉤子函式讓每個模組能夠Master程序和Worker程序啟動與退出、初始化等各種時機嵌入各自的邏輯,極大程度的提高了模組實現的靈活性。

可以這樣定義一個模組:

ngx_module_t ngx_test_module;

在ngx_core。h裡可以看到

typedef struct ngx_module_s ngx_module_t;typedef struct ngx_command_s ngx_command_t;

就是上面看到的ngx_module_s了。

可以看到每個模組都會有一個ngx_command_t結構體。

這個結構體是一個數組,裡面每一個成員是它的指令名。

Nginx生態完善,功能齊全要歸功於它,優雅的模組化設計

ngx_xxx_commands陣列用於定義模組中的配置檔案引數,每一個數組元素都是ngx_command_t型別,陣列的結尾用ngx_null_command表示。

struct ngx_command_s { ngx_str_t name; // 配置項名稱 ngx_uint_t type; // 配置項型別,指定配置項可以出現的位置。 如:出現在server還是location{}中 char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); ngx_uint_t conf; ngx_uint_t offset;// 中配置檔案中的偏移量 void *post; // 配置項讀取後,需要進行處理的方法};

Nginx生態完善,功能齊全要歸功於它,優雅的模組化設計

相關文章

Nginx之程序結構模型

Nginx處理http請求會有哪11個階段?

Nginx的Http請求11個階段之postread階段:獲取真實客戶端地址的