nginx收到hup信号或执行nginx -s reload时,master进程重新加载配置并启动新worker,旧worker优雅退出:停止接受新连接但处理完已有请求后退出;新旧worker共存期间端口复用保障服务不中断。

当 Nginx 接收到 HUP 信号时,Master 进程会启动平滑重启(reload)流程:它不中断现有连接,而是让旧 Worker 处理完正在服务的请求后退出,同时拉起新 Worker 加载更新后的配置并开始接流。
Master 进程如何触发 reload 流程
用户执行 nginx -s reload 或向 Master 进程发送 SIGHUP 信号后,Master 会:
- 重新读取并校验配置文件(
nginx.conf及其 include 的文件); - 若配置语法错误,直接报错退出 reload,旧 Worker 继续运行;
- 若校验通过,则 fork 出新的 Worker 进程,使用新配置初始化;
- 不再向旧 Worker 派发新连接,但允许其继续处理已建立的连接和请求。
Worker 进程如何实现“优雅退出”
旧 Worker 收到 Master 发送的 QUIT 信号后,并不会立即终止,而是进入“优雅关闭”状态:
- 停止接受新连接(关闭监听 socket 的 accept 队列);
- 继续处理已接收但未完成的请求(包括长连接、上传中、响应未发完等情况);
- 当所有活跃请求结束且空闲超时(默认
worker_shutdown_timeout未设时无硬限制),进程自动退出; - 可通过配置
worker_shutdown_timeout 10s;设置最大等待时间,超时后强制关闭剩余连接。
Master 如何管理新旧 Worker 的生命周期
在 reload 过程中,Master 始终保持对全部 Worker 的控制权:
- 新 Worker 启动后,会尝试绑定端口;若端口已被旧 Worker 占用(如 keepalive 连接未断开),新 Worker 仍能正常启动并接管新连接(Linux 支持
SO_REUSEPORT或由旧 Worker 主动释放监听 socket); - 旧 Worker 退出后,Master 将其从内部进程列表中移除;
- 若 reload 中出现异常(如新 Worker 启动失败),Master 会记录错误日志,但不会杀掉旧 Worker,保障服务持续可用。
验证 reload 是否成功的关键点
可结合以下方式确认 reload 已生效且无异常:
- 检查
nginx.pid文件内容是否变化(PID 不变,但内部 worker 数组已更新); - 执行
ps aux | grep nginx,观察是否有两批 Worker(旧进程状态为exiting,新进程为running); - 查看 error.log,确认有类似
"reloading configuration"和"exit日志; - 用
curl -I http://localhost或访问业务接口,确保响应正常且新配置(如新增 header、改写的 location)已生效。










