nginx多worker优雅退出由主进程统一触发:主进程收sigquit后关监听、经channel socket发quit指令;各worker设ngx_exiting=1、停接入、清空闲连接、处理完活跃请求后退出,超时由worker_shutdown_timeout兜底。

当 Nginx 启用了多 worker 进程(即 worker_processes 配置为大于 1 的值,或设为 auto)时,优雅停止旧进程的关键不在于“逐个杀掉 worker”,而在于让主进程统一触发、所有 worker 协同退出。整个过程由主进程驱动,无需手动干预单个 worker。
必须使用 SIGQUIT 触发整体退出流程
无论开启多少个 worker 进程,优雅停止的入口始终是向主进程发送 SIGQUIT(信号 3):
- 推荐命令:
nginx -s quit(自动读取 pid 文件并发送信号) - 等效手动命令:
kill -QUIT $(cat /var/run/nginx.pid)(Linux)或kill -QUIT $(cat nginx.pid)(Windows 或自定义路径) -
严禁使用
nginx -s stop、kill -TERM或kill -INT——这些会强制终止所有进程,中断正在处理的请求
worker 进程如何响应退出指令
主进程收到 SIGQUIT 后,通过内部 channel socket 向每个 worker 发送 QUIT 指令。各 worker 不响应系统信号,而是轮询该指令,并执行以下动作:
- 设置内部标志
ngx_exiting = 1,进入退出状态 - 关闭监听套接字:不再 accept 新连接,但已建立的连接仍可收发数据
- 主动关闭空闲 keepalive 连接(如 HTTP/1.1 长连接池中闲置连接)
- 继续处理已入队的请求、定时器、活跃连接上的读写事件,直到自然完成或超时
防止卡死:必须配置 worker_shutdown_timeout
多 worker 场景下,若存在慢后端、WebSocket 空闲连接、TCP 代理未断连等情况,部分 worker 可能长期无法退出。此时需在配置中显式设置兜底超时:
- 在
http或stream块中添加:worker_shutdown_timeout 30s; - 该值表示:从收到 QUIT 指令起,最多等待 30 秒;超时后,仍在处理的连接会被强制关闭,对应 worker 立即退出
- 对 HTTP 请求效果最佳;对 WebSocket、gRPC、纯 TCP 代理等无明确请求边界的场景,此配置是必要保障
验证是否真正优雅完成
不能只看进程是否消失,应结合日志与进程状态判断:
- 检查
/var/log/nginx/error.log:应出现signal 3 (SIGQUIT) received, exiting和exit日志行 - 执行
ps aux | grep nginx:主进程应仍在(等待 worker 退出),旧 worker 进程应逐个消失;若同时进行 reload 或升级,新 worker 应已就位 - 观察连接行为:客户端不应收到 502、连接重置等错误,HTTP 请求应全部正常返回











