worker_shutdown_timeout 是 Nginx 1.19.10 引入的全局指令,用于限制 worker 进程在收到 QUIT 信号后等待请求完成的最大时长,默认为 0(无限等待),设为非零值(如 10s)可避免因长连接或异常客户端导致平滑退出卡死。

worker_shutdown_timeout 是 Nginx 1.19.10 引入的指令,用于控制工作进程(worker process)在收到关闭信号(如 nginx -s reload 或系统 SIGQUIT)后,等待当前请求处理完成的最大时长。超过该时间,Nginx 将强制终止 worker 进程,即使仍有请求未结束。
作用场景:平滑重启与优雅退出
当执行重载配置(nginx -s reload)或停止服务时,Nginx 主进程会向旧 worker 进程发送 QUIT 信号,要求其停止接受新连接,并尽快完成已建立连接上的请求。此过程即“平滑退出”。worker_shutdown_timeout 就是为这个“尽快”设定一个明确的上限。
- 默认值为 0,表示不设超时,worker 会一直等待所有请求自然结束(可能无限期挂起)
- 设为非零值(如
5s、30s)后,worker 在开始关闭流程后,最多等待指定时间,超时则直接终止 - 适用于存在长连接(如 WebSocket、HTTP/2 流、慢查询响应)或客户端异常断连导致连接迟迟不释放的场景
配置方式与生效范围
该指令必须放在 main 块(即全局上下文),不能在 events、http 或 server 块中使用:
worker_processes 4;
worker_shutdown_timeout 10s;
<p>events {
worker_connections 1024;
}</p><p>http {</p><h1>...</h1><p>}它对所有 worker 进程统一生效,且仅影响主动关闭流程(reload / stop),不影响异常崩溃或 kill -9 等强制终止行为。
配合其他机制才能真正“平滑”
仅设置 worker_shutdown_timeout 不足以保证零中断,还需注意:
- keepalive_timeout 应合理设置(如 60s),避免空闲长连接拖慢退出
- proxy_ignore_client_abort off(默认)确保上游代理能感知客户端断开;若设为 on,可能掩盖真实连接状态
- 应用层需支持快速响应,例如后端服务也应有合理的超时和 graceful shutdown 逻辑
- 对于 HTTP/2 或 gRPC 等多路复用协议,单个连接承载多个请求,需确认其连接关闭行为是否符合预期
验证是否生效
可通过以下方式观察效果:
- 使用
nginx -s reload后,执行ps aux | grep nginx,观察旧 worker 是否在 timeout 时间后消失 - 开启 error_log debug(谨慎用于测试环境),日志中会出现类似
worker process [pid] exited on signal 15 after 10.000 sec的记录 - 模拟长请求(如
sleep 15后端),在 reload 时观察是否被截断或等待超时

















