根據nginx(0.7.67版本)的**,對nginx基本的程序建立,程序主體以及事件處理進行了簡要的分析。
基本上,父程序(即主程序)一開始會初始化及讀取配置,並載入各模組的功能,然後fork()出n個子程序(即工作程序),具有相同的工作邏輯和功能。父程序負責監聽訊號(如hup,quit等),通過socket pair把訊號傳遞給子程序(子程序間一般不通訊)。子程序通過事件來處理父程序傳遞的訊號。因為每個子程序都共享服務監聽埠(如http 80),當使用者傳送請求時,會觸發子程序的事件呼叫函式。因此在accept()請求的時候,需要用到mutex,保證只有乙個工作程序接受並處理請求。
nginx主程序的入口是跟一般的程式一樣的main()函式,它的**是這樣的:
int ngx_cdecl main(int argc, char *const *argv)
/*...*/
//ngx_modules陣列在objs/ngx_modules.c定義ngx_max_module = 0;for (i = 0; ngx_modules[i]; i++)
//ngx_init_cycle()函式,這是個比較重要的函式,被main, ngx_master_process_cycle //
和ngx_single_process_cycle 呼叫, 其中後兩者是在reconfigure的時候被呼叫的。
//它主要工作是,初始化cycle是基於舊有的cycle進行的; 會繼承old cycle的很多屬性,
//比如log等, 但是同時會對很多資源重新分配,
比如pool, shared mem, file handler,
//listening socket等,同時清除舊有的cycle的資源
//讀取配置檔案也是在這裡完成的
cycle = ngx_init_cycle(&init_cycle);
if (ngx_process == ngx_process_single) else
}//主程序(即父程序)的主體
//這個函式會啟動工作程序幹活,並且會處理訊號量,處理的過程中會殺死或者建立新的程序
void ngx_master_process_cycle(ngx_cycle_t *cycle)
}//ngx_start_worker_processes()函式,這個函式按指定數目n,以ngx_worker_process_cycle()函
//數為引數呼叫ngx_spawn_process()建立work程序並初始化相關資源和屬性;
//執行子程序的執行函式ngx_worker_process_cycle;向之前已經建立的所有worker廣播當前建立的
//worker程序的資訊;每個程序開啟乙個通道(ngx_pass_open_channel())
//n是worker process的數目
//type 即建立新程序式的方式,如ngx_process_respawn, ngx_process_just_respawn
static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
} ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn) /
*...*/
//建立子程序
pid = fork();
switch (pid)
} //worker程序的主體
static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
/*...*/ }
Nginx 父子程序通訊
一.參考 nginx核心講解 後加上參考原始碼,小結下nginx中父子程序 子程序間如何通訊。實現原理網上都可以查出來,主要是通過socketpair 函式實現的,下面捋一下內部流程 1.話說要從ngx start worker processes函式講起,由於 不多,貼出來 static void...
nginx 父子程序通訊 channel
nginx 中利用socketpair 函式,建立一對相互連線的socket,實現父子程序的通訊。下面分析下整個過程 一 建立 在子程序建立之前,需要建立這樣一對連線 ngx spawn process函式 ngx process.c中 二 建立子程序 接著會通過fork建立子程序,在子程序中,會呼...
使用訊號管理nginx的父子程序
master程序 通過chld監控worker程序,worker異常退出,通過chld訊號拉起worker程序。接收訊號 term,int訊號表示立刻停止worker程序 quit訊號表示優雅的停止nginx程序 hup訊號表示過載配置檔案 usr1表示重新開啟日誌檔案,切割日誌檔案 這些上面的可以...