处理信号的全局变量数组:
ngx_signal_t signals[] = {
{ ngx_signal_value(NGX_RECONFIGURE_SIGNAL),
"SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),
"reload",
ngx_signal_handler },
{ ngx_signal_value(NGX_REOPEN_SIGNAL),
"SIG" ngx_value(NGX_REOPEN_SIGNAL),
"reopen",
ngx_signal_handler },
{ ngx_signal_value(NGX_NOACCEPT_SIGNAL),
"SIG" ngx_value(NGX_NOACCEPT_SIGNAL),
"",
ngx_signal_handler },
{ ngx_signal_value(NGX_TERMINATE_SIGNAL),
"SIG" ngx_value(NGX_TERMINATE_SIGNAL),
"stop",
ngx_signal_handler },
{ ngx_signal_value(NGX_SHUTDOWN_SIGNAL),
"SIG" ngx_value(NGX_SHUTDOWN_SIGNAL),
"quit",
ngx_signal_handler },
...
}
main
--ngx_get_options // ngx_signal设置为"reload",ngx_process = NGX_PROCESS_SIGNALLER;
--ngx_signal_process
--ngx_os_signal_process // 入参的name就是ngx_signal,即"reload"
--kill(pid, sig->signo) // 对master进程pid执行Kill -SIGHUP,
--ngx_signal_handler // case ngx_signal_value(NGX_RECONFIGURE_SIGNAL):
// ngx_reconfigure = 1;
--ngx_master_process_cycle
--ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_JUST_RESPAWN); // 启新的worker
--ngx_signal_worker_processes(cycle,
ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); // 关闭老的worker
--kill(ngx_processes[i].pid, signo)
--ngx_signal_handler // case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):
// ngx_quit = 1;
ngx_worker_process_cycle
{
...
if (ngx_quit) {
ngx_quit = 0;
ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
"gracefully shutting down");
ngx_setproctitle("worker process is shutting down");
if (!ngx_exiting) {
ngx_exiting = 1;
ngx_set_shutdown_timer(cycle);
ngx_close_listening_sockets(cycle); // 关闭监听句柄
ngx_close_idle_connections(cycle); // 关闭空闲链接
}
}
...
}