nginx -s reload 是标准且最安全的热加载方式,它自动向 master 进程发送 hup 信号,先校验配置语法,再启动新 worker 进程并优雅关闭旧进程,全程不中断连接。

直接用 nginx -s reload 就是发送 HUP 信号的标准方式,它底层就是向 Nginx 主进程发 SIGHUP,不需要手动调用 kill ——除非你有特殊权限或路径限制。
标准命令:nginx -s reload
这是最推荐、最安全的做法。它会自动查找主进程 PID 并发送 HUP 信号,前提是:
- Nginx 正在运行(
systemctl is-active nginx返回active) - 当前用户对 master 进程有信号权限(通常 root 或 nginx 所属组用户)
- 配置语法已通过验证(先执行
nginx -t,确保输出 syntax is ok 和 test is successful)
手动发 HUP 信号的两种常用方式
当 nginx -s reload 不可用(比如权限受限、二进制不在 PATH 中),可手动发送:
-
sudo kill -HUP $(cat /var/run/nginx.pid)—— 适用于 PID 文件路径为默认位置 -
sudo kill -HUP $(pgrep -f "nginx: master")—— 更通用,不依赖 PID 文件是否存在
注意:/var/run/nginx.pid 路径可能因安装方式不同而变化(如源码编译常在 /usr/local/nginx/logs/nginx.pid),需以你的 nginx.conf 中 pid 指令定义为准。
为什么 HUP 能平滑重载
Nginx 主进程收到 HUP 后,会做三件事:
- 重新读取并校验配置文件
- 启动一批新 worker 进程,使用新配置处理后续请求
- 通知旧 worker 进程“不再接受新连接”,但继续服务已有长连接直到自然结束
整个过程不关闭监听端口,客户端无感知,连接不断开。
发完 HUP 后必须验证是否真正生效
不能只看终端没报错。要交叉检查:
-
进程时间:执行
ps aux | grep nginx,新 worker 的 START 时间应接近你发信号的时刻 -
错误日志:
tail -n 3 /var/log/nginx/error.log应出现 reopening logs 或 signal 1 (SIGHUP) received,且无 ERROR 级报错 -
实际行为:改了
server_name就用curl -H "Host: xxx" http://127.0.0.1测试;改了location就访问对应路径确认是否命中新规则











