Nginx平滑重启是新旧Worker并行运行、连接自然分流,由Master统一调度且用户无感;先执行nginx -t校验配置语法与语义,任一失败则reload中止、服务零影响。

Nginx 的平滑重启不是“杀旧启新”,而是让新旧 Worker 并行运行一小段时间,连接自然分流、请求各自收尾。整个过程由 Master 进程统一调度,用户完全无感。
配置校验是第一道安全阀
Master 不会盲目加载新配置,必须先通过完整检查:
- 语法是否合法(如括号匹配、指令拼写)
- 语义是否可行(端口是否被占用、证书路径是否存在、用户权限是否足够)
- include 文件能否全部读取
任一失败,Master 直接报错退出 reload 流程,旧 Worker 继续运行,服务零影响。验证命令始终是:
nginx -t 或 nginx -t -c /path/to/nginx.conf
新旧 Worker 并存与连接分流机制
校验通过后,Master 启动新 Worker,并控制旧 Worker 进入优雅退出状态:
- 新 Worker 立即调用 accept(),开始处理所有新建连接(含 HTTP/2 多路复用、WebSocket 握手等)
- 旧 Worker 收到 QUIT 信号后,不再 accept 新连接,但继续处理已建立的连接:上传中的文件、长轮询响应、未发完的 chunked body、keepalive 空闲连接等
- 监听 socket 通过内核级句柄继承或 SO_REUSEPORT 共享,无需重新 bind/listen,端口不冲突、连接不拒绝
退出节奏可控,避免长连接滞留
旧 Worker 不会无限等待,Master 提供两个关键控制点:
- worker_shutdown_timeout 10s;(可配,单位秒):设定最大优雅等待时间,超时后强制关闭残留连接
- 日志中出现 "gracefully shutting down" 表示已进入退出流程,出现 "exiting" 表示进程终止
验证是否真正完成过渡
- 查看进程:ps aux | grep nginx,确认旧 Worker PID 消失,仅剩新 Worker
- 检查配置生效:nginx -T 输出应为最新配置内容
- 观察日志:tail -f /var/log/nginx/error.log 中不再有旧 Worker 启动记录,新 Worker 日志持续滚动
- 抓包或 curl 测试:新建连接走新配置逻辑(如新增 header、改了 upstream),存量长连接仍按旧规则响应
不复杂但容易忽略











