平滑重载(nginx -s reload)仅使用sighup信号触发master校验配置并启动新worker,再通过channel指令让旧worker优雅退出;sigwinch仅用于二进制升级中通知旧master关闭其worker,误用会导致服务中断。

你这里有个关键概念混淆:平滑重载(nginx -s reload)过程中,不需要、也不应该向旧 Master 进程发送 SIGWINCH 信号。SIGWINCH 是用于 平滑升级(binary upgrade) 场景中关闭旧 Worker 的指令,和配置重载是两套独立机制。
平滑重载不涉及 WINCH,核心是 SIGHUP + channel 指令
执行 nginx -s reload 或 kill -HUP $(cat /var/run/nginx.pid) 时:
- 系统向 当前运行的 Master 进程 发送 SIGHUP 信号
- Master 校验新配置,成功后 fork 出一批使用新配置的新 Worker 进程
- Master 通过内部 channel socket 向 所有旧 Worker 进程 发送 QUIT 指令(不是信号)
- 旧 Worker 收到指令后标记
ngx_exiting = 1,停止 accept 新连接,处理完存量请求后自行退出 - 整个过程只有 1 个 Master 进程,它始终在线协调,不会产生“旧 Master”
WINCH 信号只在平滑升级中出现
SIGWINCH 的作用对象是 旧 Master 进程,但仅出现在二进制升级流程里:
- 先发
SIGUSR2→ 启动新 Master + 新 Worker,此时新旧 Master 共存 - 再向 旧 Master 发
SIGWINCH→ 旧 Master 转发指令,让它的 Worker 优雅退出 - 最后向旧 Master 发
SIGQUIT→ 旧 Master 自身退出(但实践中常残留,属设计行为)
误发 WINCH 到 Master 可能导致意外行为
如果在 reload 场景下手动对 Master 执行 kill -WINCH $pid:
- Master 会尝试关闭所有 Worker 进程(类似滚动发布前的准备)
- 但此时没有新 Worker 启动,服务将短暂中断或完全停止监听
- 这不是重载,而是主动触发 worker 全部退出,等同于部分 shutdown
正确操作对照表
请严格按场景选择命令:
-
改了 nginx.conf,要生效? → 用
nginx -s reload或kill -HUP $master_pid -
升级 nginx 二进制文件(如打补丁)? → 先
kill -USR2 $master_pid,确认新进程起来后,再kill -WINCH $old_master_pid -
只想停掉所有 Worker,保留 Master? →
kill -WINCH $master_pid(慎用,非常规运维操作)











