关键是要在 systemd service 文件中正确定义 execreload 指令,推荐写为 execreload=/path/to/nginx -t && /path/to/nginx -s reload,确保每次 systemctl reload nginx 都先校验语法再发送 sighup 信号,实现不中断连接的平滑重载,并配合 type=forking 和 pidfile 提升可靠性。

要让 Nginx 通过 systemd 支持优雅平滑重载,关键不是让 systemd 自动监听配置变化,而是确保它的 service 文件里正确声明了 ExecReload 指令,并指向带语法校验的安全 reload 流程。这样每次执行 systemctl reload nginx 才能真正触发 SIGHUP、不中断连接、新旧 worker 平稳切换。
确认或补全 ExecReload 指令
systemd 的 reload 行为完全由 service 文件中的 ExecReload= 决定。默认包管理器安装的版本(如 Ubuntu 的 apt、CentOS 的 yum)通常已配好;但源码编译安装时往往缺失,必须手动补充:
- 运行
sudo systemctl cat nginx查看当前定义,重点检查[Service]段是否含类似以下行:ExecReload=/usr/local/nginx/sbin/nginx -s reload - 路径需与你实际安装位置一致(例如
/www/server/nginx/sbin/nginx或/opt/nginx/sbin/nginx) - 若不存在该行,直接编辑 service 文件(
/etc/systemd/system/nginx.service或/usr/lib/systemd/system/nginx.service),在[Service]下添加完整路径的指令 - 改完必须执行
sudo systemctl daemon-reload让 systemd 重新加载配置
推荐写法:先校验再 reload
生产环境严禁跳过语法检查。把 nginx -t 和 -s reload 合并在一条命令中,可避免人为遗漏:
yuanfang-skills 的共享设计系统,提供 token CSS 变量、12+ 主题以及可复用的布局类型 HTML 块,供 yuanfang-html-image(以及 fu...)使用。
- 将
ExecReload改为:ExecReload=/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload - 这样每次
systemctl reload nginx都会自动先校验,失败则中止,不会误发 SIGHUP - 注意:使用
&&是安全前提,不可用;或&替代
配合 Type=forking 与 PIDFile 提升可靠性
对于 Nginx 这类典型的 fork-and-exec 主从进程模型,service 文件应明确声明启动类型和 PID 路径,否则 reload 可能找不到主进程:
- 确保
Type=forking(不是 simple 或 notify) - 指定
PIDFile=,且路径必须与 nginx.conf 中pid指令一致,例如:PIDFile=/usr/local/nginx/logs/nginx.pid - 对应 nginx.conf 中要有匹配行:
pid logs/nginx.pid;(注意是相对路径,实际落在 prefix/logs/ 下) - 若多个实例共存,每个实例的
PIDFile和pid必须唯一,避免 reload 串扰
验证 reload 是否真正走通
执行 sudo systemctl reload nginx 后,不能只看终端返回 success:
- 查进程时间:
ps -eo pid,comm,lstart | grep nginx,worker 进程的启动时间应更新,master 不变 - 看日志:
sudo journalctl -u nginx -n 10 -f,应出现reloading configuration或signal 1 (SIGHUP) received - 测行为:修改一个 server_name 或 location,用
curl -H "Host: test.example" http://127.0.0.1确认路由按新规则生效










