標籤:nginx 高效能伺服器 socket nginx啟動
nginx的啟動過程緊緊圍繞著ngx_cycle_t的結構體展開,首先通過ngx_get_options()擷取命令列參數,然後通過ngx_time_init()進行時間的初始化,如全域變數ngx_cached_time;再通過ngx_regx_init()完成正則的初始化,通過ngx_log_init()建立日誌對象,初始化日誌,如初始化全域變數ngx_prefix,開啟記錄檔ngx_log_file.fd;通過ngx_create_pool()建立記憶體池,大小為1024B;ngx_save_argv()儲存命令列參數至全域變數ngx_os_argv、ngx_argc、ngx_argv;通過ngx_process_options()處理init_cycle中的設定檔路徑,初始化ngx_cycle的prefix, conf_prefix, conf_file, conf_param等欄位;ngx_os_init()完成作業系統的一些資訊的擷取,如記憶體頁面大小、系統限制資源等資訊,將其儲存在對應的全域變數中,通過ngx_crc32_table_init()初始化一個迴圈冗餘校正表,為後面高效尋找迴圈冗餘做準備;通過ngx_add_inherited_sockets:通過環境變數
- 解析環境變數NGINX_VAR="NGINX"中的sockets,並儲存至ngx_cycle.listening數組;
- 設定ngx_inherited=1;
- 調用ngx_set_inherited_sockets()逐一對ngx_cycle.listening數組中的sockets進行設定;
然後對模組數組中的各模組進行編號,繼而調用ngx_init_cycle()完成對ngx_cycle_t類型變數cycle的初始化,在ngx_init_t中做的事情如:
之後,根據條件調用 ngx_signal_process()對進程訊號處理,通過ngx_os_status()擷取作業系統的狀態資訊,讀取設定檔的資訊,
- 若有訊號,則進入ngx_signal_process()處理;
- 調用ngx_init_signals()初始化訊號;主要完成訊號處理常式的註冊;
- 若無繼承sockets,且設定了守護進程標識,則調用ngx_daemon()建立守護進程;
- 調用ngx_create_pidfile()建立進程記錄檔案;(非NGX_PROCESS_MASTER=1進程,不建立該檔案)
- 進入進程主迴圈;
- 若為NGX_PROCESS_SINGLE=1模式,則調用ngx_single_process_cycle()進入進程迴圈;
- 否則為master-worker模式,調用ngx_master_process_cycle()進入進程迴圈;
- 具體可參考<nginx源碼分析—master/worker進程啟動>;
參考:http://blog.csdn.net/livelylittlefish/article/details/7243718
nginx啟動過程分析