nginx-s reload 源碼分析

執行./nginx -s reload 向master進程發送重啟信號

1、nginx程序解析命令行參數

ngx_get_options(argc, argv)

此函數進去可以看到

ngx_signal這個靜態變量會被賦值reload

即:ngx_signal="reload"

2、如果用了-s參數,那麼就要發送reload/stop等信號,然後結束

 if (ngx_signal) {
 return ngx_signal_process(cycle, ngx_signal);
}

接著在調用它ngx_os_signal_process(cycle, sig, pid) 可以看到最後調用kill(pid, sig->signo)向

master進程的pid發送信號

3、信號捕獲

之前nginx在啟動的時候會調用ngx_init_signals(cycle->log)這個函數給信號綁定這個處理器ngx_signal_handler。

當調用kill的時候會觸發ngx_signal_handler使ngx_reconfigure = 1

4、創建新的work進程 cache進程

從這個函數ngx_master_process_cycle(cycle)最後可以看到

 // 收到了-s reload重新配置
 if (ngx_reconfigure) {
 ngx_reconfigure = 0;
​
 if (ngx_new_binary) {
 ngx_start_worker_processes(cycle, ccf->worker_processes,
 NGX_PROCESS_RESPAWN);
 ngx_start_cache_manager_processes(cycle, 0);
 ngx_noaccepting = 0;
​
 continue;
 }
​
 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring");
 cycle = ngx_init_cycle(cycle);
 if (cycle == NULL) {
 cycle = (ngx_cycle_t *) ngx_cycle;
 continue;
 }
 ngx_cycle = cycle;
 ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,
 ngx_core_module);
 ngx_start_worker_processes(cycle, ccf->worker_processes,
 NGX_PROCESS_JUST_RESPAWN);
 ngx_start_cache_manager_processes(cycle, 1);
​
 /* allow new processes to start */
 ngx_msleep(100);
 live = 1;
 ngx_signal_worker_processes(cycle,ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
 }

nginx開始進行創建新的進程關閉老的進程


分享到:


相關文章: