執行./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開始進行創建新的進程關閉老的進程