要让 systemd 在 Nginx 崩溃后自动重启,需配置 Restart=always、RestartSec=5、StartLimitIntervalSec=60 和 StartLimitBurst=3,并正确设置 Type=forking 或 Type=notify 以准确识别 master 进程,同时添加 MemoryLimit、RestartPreventExitStatus 等防护机制并实测验证。

要让 systemd 在 Nginx 崩溃后自动重启,关键不是只靠 Restart=always,而是结合进程存活判断、启动失败兜底和资源隔离机制,避免反复崩溃导致系统过载。
启用基础自动重启策略
在 Nginx 的 systemd 单元文件(通常是 /etc/systemd/system/nginx.service 或 /lib/systemd/system/nginx.service)中,确保包含以下重启相关配置:
- Restart=always:无论退出状态码如何都重启(包括被 kill、段错误、主动 exit)
- RestartSec=5:每次重启前等待 5 秒,防止高频崩溃打满日志或耗尽资源
- StartLimitIntervalSec=60 和 StartLimitBurst=3:1 分钟内最多启动 3 次,超限后暂停重启并标记为 failed(需人工介入)
确保 systemd 能准确识别 Nginx 主进程
默认情况下,Nginx 启动后会 fork 出 master 进程和多个 worker 进程。systemd 若只监控启动命令的前台进程(已退出),就会误判服务“已停止”。必须显式指定主进程:
- 添加 Type=forking(适用于传统 daemon 模式)并配合 PIDFile=/var/run/nginx.pid
- 更推荐使用 Type=notify + nginx -g "daemon on; master_process on;",再在 nginx.conf 中启用
systemd_support on;(需 Nginx ≥ 1.19.10 且编译时含 systemd 支持) - 验证方式:
systemctl show nginx --property=Type,MainPID,确保 MainPID 持续指向 master 进程 PID
增加崩溃防护与可观测性
单纯重启不够,需定位根源并限制影响范围:
- 添加 MemoryLimit=512M 和 RestartPreventExitStatus=SIGUSR1 SIGUSR2:避免因平滑重载(USR1/USR2)被误判为异常退出
- 启用 FailureAction=reboot(谨慎使用):若连续多次崩溃,触发安全重启,防止状态腐化
- 配置 ExecStartPost=/bin/sh -c 'sleep 1; nginx -t && nginx -s reload 2>/dev/null || true':启动后校验配置有效性,避免 reload 失败导致后续异常
- 用
journalctl -u nginx -f实时观察崩溃前最后几条日志,重点关注 “segmentation fault”、“bus error” 或 “worker process .* exited on signal”
验证与调试方法
配置完成后必须实测,不能仅依赖语法检查:
- 重载配置:
sudo systemctl daemon-reload - 手动杀死 master 进程:
sudo kill -9 $(cat /var/run/nginx.pid),观察是否在 5 秒后自动拉起 - 触发快速连续崩溃:
for i in {1..4}; do sudo kill -9 $(cat /var/run/nginx.pid); sleep 0.5; done,确认第 4 次后状态变为failed(受 StartLimit 限制) - 检查重启记录:
systemctl status nginx | grep "Started\|restarted"
不复杂但容易忽略的是进程类型匹配和启动频率限制——配错 Type 或漏掉 StartLimit,要么无法重启,要么把系统拖垮。










