nginx采用master-worker多进程架构,master是唯一接收信号的进程,通过unix信号与channel socket协同调度worker。sighup重载配置,sigquit优雅停止,sigusr1重开日志,sigusr2+sigwinch平滑升级,sigterm/sigint强制终止;worker不响应信号,只监听master下发的channel指令,确保有序、可靠、优雅退出。

Master 是信号的“唯一收件人”
只有 Master 进程绑定并响应系统信号,Worker 进程默认忽略绝大多数信号(如 SIGHUP、SIGUSR1 等)。这是设计上的主动隔离——避免多个 Worker 同时响应同一信号导致状态混乱。
常见操作本质都是向 Master 发信号:
-
nginx -s reload→ 实际执行kill -SIGHUP $(cat nginx.pid) -
nginx -s quit→ 实际执行kill -SIGQUIT $(cat nginx.pid) -
nginx -s stop→ 实际执行kill -TERM $(cat nginx.pid)
关键信号对应的核心动作
每种信号触发 Master 的特定逻辑,而非简单终止或重启:
-
SIGHUP:重载配置。Master 重新解析
nginx.conf,启动新 Worker,再向旧 Worker 发送QUIT指令(通过 channel socket,非信号);旧 Worker 处理完存量请求后退出 -
SIGQUIT:优雅停止。Master 关闭监听套接字,通过 channel 向所有 Worker 发送
QUIT;Worker 进入ngx_exiting = 1状态,不再 accept 新连接,但继续服务已有连接直至自然结束 - SIGUSR1:日志重开。Master 通知各 Worker 关闭当前 access/error 日志文件句柄,并重新 open 同名文件,实现无缝轮转(常配合 logrotate)
-
SIGUSR2 + SIGWINCH:平滑升级。先用
SIGUSR2启动新版本 Master+Worker;再用SIGWINCH通知旧 Worker 逐步退出,新旧版本短暂共存 -
SIGTERM / SIGINT:强制停止。Master 立即向 Worker 发
SIGTERM,自身退出,不等待 Worker 清理
Worker 不直收信号,靠 channel 指令协作
Worker 进程不响应外部信号,而是持续轮询 Master 通过 Unix domain socket(即 channel)发来的控制指令。这种设计带来几个实际好处:
- 指令传递有序、可靠,避免信号丢失或竞态
- Worker 可自主判断退出时机(比如等一个慢后端响应完成),真正实现“优雅”
- 无需共享内存或信号量同步,降低复杂度和移植门槛
例如收到 QUIT 指令后,Worker 会标记退出状态、停止 accept、继续处理 timer、pending read/write 和已建立连接,直到全部任务完成才调用 ngx_worker_process_exit()。
运维中信号使用的注意事项
信号本身简单,但生效依赖完整链路:
- 确保
nginx.pid文件存在且路径正确(由pid指令配置),否则kill找不到目标 - Worker 若卡在阻塞调用(如未超时的 upstream 请求),会导致
quit或reload延迟;可通过proxy_read_timeout等设置规避 - 查看
error.log中"exiting"、"exit"日志,确认每个 Worker 是否正常终结 - 不要对 Worker 进程直接发信号(如
kill -QUIT [worker-pid]),它们不处理,也破坏 Master 的统一管控逻辑











