可以做到。Nginx master进程支持SIGHUP信号,重载配置时保持TCP连接不中断;需向master PID发信号,推荐用systemctl reload nginx或kill -HUP $(cat /var/run/nginx.pid),并提前执行nginx -t验证配置。

可以做到。Nginx 的 master 进程原生支持 SIGHUP(信号编号 1),它不会退出,而是重新读取配置、启动新 worker,并让旧 worker 继续服务已有连接——整个过程客户端无感知,TCP 连接不中断。
确认 master 进程 PID 并确保权限正确
只有向 master 进程发信号才有效,worker 进程不响应 HUP。常见获取方式:
- 读取默认 PID 文件:cat /var/run/nginx.pid
- 若为编译安装,PID 路径可能不同,例如:/usr/local/nginx/logs/nginx.pid
- 用 ps 精确匹配 master:ps aux | grep "nginx: master process"
- 确保执行用户有权限向该 PID 发送信号(通常需 root 或 nginx 启动用户)
发送 HUP 信号触发热加载
标准命令如下(推荐使用信号名,更清晰):
- kill -HUP $(cat /var/run/nginx.pid)
- 等效写法(用编号):kill -1 $(cat /var/run/nginx.pid)
- 若使用 systemd 管理,更稳妥的方式是:systemctl reload nginx(它底层调用的就是 kill -HUP,并自带语法校验和依赖检查)
验证热加载是否成功且连接未中断
三方面快速确认:
- 进程状态:执行 ps aux | grep nginx,应看到 master PID 不变,但 worker 进程 PID 已更新(新旧 worker 可能短暂共存)
- 错误日志:查看 /var/log/nginx/error.log,成功时会有类似 "reloading configuration" 的记录,且无 fatal 错误
- 连接连通性:用 ss -tn state established | grep :80 或持续 curl 测试,已建立的 TCP 连接(含 keep-alive 空闲连接)保持活跃,新请求按新配置路由
关键注意事项
这个机制不是 kill 命令通用行为,而是 Nginx 自身实现的协作逻辑:
- 必须先运行 nginx -t 验证配置语法,否则 master 拒绝重载,旧 worker 继续工作但新配置无效
- 不要对 worker 进程 PID 发送 HUP —— 它只作用于 master;误发可能导致单个 worker 异常退出
- SSL 证书路径、日志目录权限等若出错,新 worker 启动失败,master 会维持旧 worker,但后续请求可能因配置不一致返回 502
- 像 keepalive_timeout 这类参数变更,仅对新连接生效,不影响旧连接中已设定的超时计时器











