三 深入理解Nginx的模組化 (結合原始碼詳解)

2021-07-13 18:09:16 字數 2614 閱讀 1326

盜用前面用到的流程圖

第二步實際上是呼叫ngx_add_inherited_sockets()

//檔名: nginx.c

int ngx_cdecl

main(int argc, char *const *argv)

...}

nginx在不重啟服務公升級,舊版本的master程序會通過execve系統呼叫來啟動新版本的master程序(先 fork()出子程序再呼叫exec來執行新程式),這時舊版本 的master程序通過 環境變數通知新版本的master這是在公升級,新版本的master程序通過ngx_add_inherited_sockets()方法 由環境變數裡讀取平滑公升級資訊,並對舊版本nginx服務監聽 的控制代碼做繼承處理 。

3~8步都在ngx_init_cycle()方法中執行的。在初始化ngx_cycle_t中所有的容器後,會為讀取、解析檔案 做準備工作。因為每個 模組都必須有相應的資料結構來 儲存配置檔案中的各配置項,建立這些資料結構的工作都需要在這一步進行。nginx框架只關心ngx_core_module核心模組,從而降低框架的複雜度,這裡將會呼叫所有核心模組的create_conf的方法(也只有核心模組才有這個方法 ),這意味著所有核心模組開始構造用於儲存配置項的結構體。非核心模組將由每個模組進行管理,如 http模組都由ngx_http_module管理。這樣ngx_http_module在解析自己感興趣的」http」配置項時,將會呼叫所有http模組 約定的方法來 建立儲存配置的結構體

//檔名 ngx_cycle.h

typedef

struct ngx_cycle_s ngx_cycle_t;

struct ngx_cycle_s ;

呼叫配置模組提供的解析配置項方法 。遍歷nginx.conf的所有配置項,對於任一配置項,將會檢查所有核心模組以找出對它所感興趣的模組。並呼叫該模組在ngx_command_t結構體中的定義的 配置項處理辦法 。

呼叫所有的ngx_core_module核心模組的init_conf的 方法。這一步驟的 目的在於讓所有核心模組在解析完配置項可以做綜合性處理。

之前第四步在 解析配置項時,所有的模組都已經解析出自己需要監聽的埠 ,如http模組 已經 在 解析http配置項時得到要監聽的埠 ,並新增到listening陣列中。這一步驟就是按照listening陣列中的每乙個ngx_listening_t元素設定socket控制代碼並監聽埠,實際上就是呼叫ngx_open_listening_sockets()

在這個階段會呼叫所有模組的init_module方法。接下來 就是根據 配置nginx執行模式決定如何工作。

接下來流程可以參考之前的部落格nginx**分析

master採用的是訊號的方式通知worker程序停止服務或更換日誌。在函式ngx_worker_process_cycle()通過檢查ngx_exiting、ngx_terminate、ngx_quit、ngx_reopen這4個標誌位來決定後續動作。

master程序不需要處理網路事件,不負責業務的執行,只會通過該管理worker等子程序來實現重啟服務、平滑公升級、更換日誌檔案、配置檔案實時生效等 功能 。

master程序中所有子程序相關的狀態資訊都儲存在ngx_processes陣列中,下面 是陣列元素的型別ngx_process_t的 結構的定義,**如下 :

typedef

struct ngx_process_t;

ngx_spawn_process方法封裝了fork系統呼叫,並且會從ngx_processes陣列中選擇乙個還未使用的ngx_process_t元素儲存這個子程序的相關資訊。

深入理解Nginx的 模組化 ,全域性觀

auto 自動檢測系統環境以及編譯相關的指令碼 cc 關於編譯器相關的編譯選項的檢測指令碼 lib nginx編譯所需要的一些庫的檢測指令碼 os 與平台相關的一些系統引數與系統呼叫相關的檢測 types 與資料型別相關的一些輔助指令碼 conf 存放預設配置檔案,在make install後,會拷...

一深入理解Nginx的 模組化 ,全域性觀

auto 自動檢測系統環境以及編譯相關的指令碼 cc 關於編譯器相關的編譯選項的檢測指令碼 lib nginx編譯所需要的一些庫的檢測指令碼 os 與平台相關的一些系統引數與系統呼叫相關的檢測 types 與資料型別相關的一些輔助指令碼 conf 存放預設配置檔案,在make install後,會拷...

模組化的理解,以及模組化的好處

先理解模組 在程式設計中,為完成某一功能所需的一段程式或子程式 或指能由編譯程式 裝配程式等處理的獨立程式單位 或指大型軟體系統的一部分。可以這樣理解每乙個頁面中的部分都可以看成乙個模組。模組化是指解決乙個複雜問題時自頂向下逐層把系統劃分成若干模組的過程,有多種屬性,分別反映其內部特性。是指將每乙個...