nginx -s reload原理

时间:2025-02-18 09:58:40
  • 处理信号的全局变量数组:
  • 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 },
  • ...
  • }
  • #define NGX_SHUTDOWN_SIGNAL QUIT
  • #define NGX_TERMINATE_SIGNAL TERM
  • #define NGX_NOACCEPT_SIGNAL WINCH
  • #define NGX_RECONFIGURE_SIGNAL HUP
  • 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); // 关闭空闲链接
  • }
  • }
  • ...
  • }