systemd 配置 Nginx 自动重启的核心是:设 Restart=always、RestartSec=5、StartLimitInterval=0,并匹配 Type=forking 与 PIDFile,禁用启动限流以防冻结,且必须通过 kill -SEGV 模拟崩溃验证,而非 systemctl restart。

systemd 是现代 Linux 发行版(CentOS 7+、Ubuntu 16.04+、Debian 9+)配置守护进程自动重启的首选方式。它不是“能用就行”的备选方案,而是唯一能同时满足依赖管理、日志集成、资源限制和重启退避策略的原生方案。
直接修改 nginx.service 的 [Service] 段最安全
不要直接编辑 /lib/systemd/system/nginx.service —— 这是包管理器维护的文件,下次更新可能被覆盖。正确做法是用 systemctl edit 创建覆盖片段:
sudo systemctl edit nginx
在打开的编辑器中写入:
[Service] Restart=always RestartSec=5 StartLimitInterval=0
关键点:
-
Restart=always:进程退出(无论退出码、信号或崩溃)都触发重启;若只想在非 0 退出码时重启,改用on-failure -
RestartSec=5:避免秒级反复拉起,5 秒是生产环境常用值;设为 0 会立即重试,高风险 -
StartLimitInterval=0:禁用 systemd 默认的“10 秒内最多启动 5 次”限制,否则进程持续崩溃后会被永久冻结
Type=forking 和 Type=simple 必须匹配 Nginx 启动行为
Nginx 默认以 daemon 方式运行(fork 子进程后父进程退出),此时必须设 Type=forking 并指定 PIDFile,否则 systemd 会误判进程已死并反复重启:
[Service] Type=forking PIDFile=/run/nginx.pid ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID
如果你强制让 Nginx 前台运行(如加 -g "daemon off;"),才可用 Type=simple —— 但不推荐,会失去标准日志和信号处理路径。
常见错误现象:systemctl status nginx 显示 inactive (dead) 却有 nginx 进程在跑,就是 Type 不匹配导致的。
验证重启逻辑不能只靠 systemctl restart
systemctl restart 是主动控制,不触发 Restart=* 策略。真正测试自动重启,得模拟崩溃:
- 查主进程 PID:
pgrep -f "nginx: master" - 发送 SIGSEGV 强制崩溃:
kill -SEGV <pid>(比kill -9更贴近真实崩溃场景) - 等 5 秒后执行
systemctl is-active nginx,应返回active
注意:RestartSec 计时从进程完全退出后开始,不是从 signal 发出瞬间算起。
日志和健康检查必须配套,否则重启只是掩盖问题
自动重启本身不解决根本问题。没日志就等于盲操作:
- 确保
StandardOutput=syslog和StandardError=syslog已启用(默认通常开启) - 用
journalctl -u nginx -n 50 -f实时盯住崩溃前最后几行输出 - 如果进程频繁重启,先查
journalctl -u nginx --since "2 hours ago" | grep -i "segmentation\|abort\|core",而不是调大RestartSec
真正难的从来不是“怎么让它重启”,而是“为什么它总要重启”。Restart=always 是兜底手段,不是替代调试的捷径。


















