Nginx平滑重启依赖master-worker进程模型,通过SIGHUP信号实现配置热加载;确认方式为ps aux | grep nginx查看双进程结构,操作前必须执行nginx -t校验配置。

nginx 平滑重启不是简单地 kill 再 start,而是通过信号机制让旧进程处理完当前请求后优雅退出,新进程同时接管新连接——整个过程服务不中断、连接不丢包。
如何确认 nginx 是否支持平滑重启
运行 nginx -V 查看编译参数,重点确认是否包含 --with-http_ssl_module(HTTPS 必需)和 --with-file-aio(高并发优化),但真正决定能否平滑重启的是进程模型本身。只要使用默认的 master-worker 模式(绝大多数安装默认启用),就天然支持。可通过 ps aux | grep nginx 验证:应看到一个 master 进程和若干 worker 进程。
执行平滑重启的两种标准方式
推荐优先使用 nginx -s reload:它向 master 进程发送 SIGHUP 信号,master 会重新加载配置、启动新 worker,再逐步关闭旧 worker。
- 操作前务必先校验配置:nginx -t,避免 reload 失败导致服务异常
- 若提示 "nginx: configuration file /etc/nginx/nginx.conf test is successful",再执行 reload
- 也可直接发信号:kill -HUP $(cat /var/run/nginx.pid),适合脚本集成或 pid 文件路径非默认时
热更新二进制文件(升级 nginx 本身)
不重启服务更换 nginx 可执行文件,适用于安全补丁或小版本升级。关键在于原子替换 + 信号协同:
- 备份原二进制:cp /usr/sbin/nginx /usr/sbin/nginx.bak
- 拷贝新 nginx 到相同路径,确保权限一致:chmod 755 /usr/sbin/nginx
- 向 master 进程发送 USR2 信号:kill -USR2 $(cat /var/run/nginx.pid),此时会启动新 master + 新 worker,老进程保持运行
- 确认新进程已就位:ps aux | grep nginx 应显示两组 master/worker
- 发送 WINCH 给旧 master:kill -WINCH $(cat /var/run/nginx.pid.oldbin),使其逐步关闭旧 worker
- 最后用 QUIT 退出旧 master:kill -QUIT $(cat /var/run/nginx.pid.oldbin)
常见问题与快速诊断
reload 后访问异常?先检查日志:tail -f /var/log/nginx/error.log。典型原因包括:
- 新配置中 listen 端口被占用(如其他服务抢了 80 端口)
- SSL 证书路径变更但文件未复制或权限不对(nginx worker 用户需有读权限)
- upstream server 地址写错,导致 502 错误
- 旧 worker 未完全退出,可用 nginx -s stop 强制终止(慎用,会丢连接)










