Nginx 意外宕机后自动拉起并告警,需配置 systemd 重启策略(Restart=always、RestartSec=5、StartLimitIntervalSec/StartLimitBurst)与 OnFailure 告警联动,并加入内存限制、退出码过滤及启动后校验。

让 Nginx 在意外宕机后自动拉起,核心靠 systemd 的重启策略;要同时触发告警,则需在服务异常时联动通知机制。两者需配合配置,不能只依赖单一手段。
设置 systemd 自动重启策略
systemd 是 Linux 主流服务管理器,它能监控进程状态并按规则响应。关键不是简单加 Restart=always,而是组合使用多个参数防止“崩溃风暴”:
- Restart=always:无论退出码(包括被 kill、段错误、主动 exit)都重启
- RestartSec=5:每次重启前等待 5 秒,避免高频重启打满日志或耗尽资源
- StartLimitIntervalSec=60 与 StartLimitBurst=3:1 分钟内最多启动 3 次,超限则停止尝试并标记为 failed(需人工介入)
-
Type=forking 或更优的 Type=notify:确保 systemd 能准确识别 Nginx master 进程,而不是误判前台命令退出即服务终止。若用 notify,需在 nginx.conf 中启用
systemd_support on;,且 Nginx ≥ 1.19.10、编译含 systemd 支持 - PIDFile=/run/nginx.pid(仅 Type=forking 时必需):配合 PID 文件定位主进程
添加崩溃防护与状态校验
单纯重启无法解决根本问题,还可能掩盖隐患。应加入轻量级防护和启动后验证:
- MemoryLimit=512M:限制内存上限,防 OOM 导致连锁崩溃
- RestartPreventExitStatus=SIGUSR1 SIGUSR2:避免平滑重载(如 reload、reopen 日志)被误判为异常退出
-
ExecStartPost= 启动后执行校验:
/bin/sh -c 'sleep 1; nginx -t && nginx -s reload 2>/dev/null || true',确保配置有效,防止 reload 失败引发后续故障 - 确认生效:
systemctl show nginx --property=Type,MainPID,Restart,RestartSec,检查 MainPID 是否持续更新
集成基础告警机制
systemd 本身不发通知,但可通过 OnFailure= 触发自定义单元,实现邮件、Webhook 或日志标记:
- 新建告警服务单元,例如
/etc/systemd/system/nginx-failed-alert.service:
[Service]<br>Type=oneshot<br>ExecStart=/usr/bin/logger "ALERT: nginx service failed at $(date)"<br>ExecStart=/usr/bin/curl -X POST -H "Content-Type: application/json" -d '{"text":"nginx crashed on $(hostname)"}' https://your-webhook-url - 在
nginx.service的 [Unit] 段中添加:OnFailure=nginx-failed-alert.service - 也可用 journalctl + logrotate + 自定义脚本监听
journalctl -u nginx -n 1 --no-pager | grep "failed\|exited\|killed",定时扫描并触发告警
验证是否真正生效
配置完必须实测,不能只看语法或状态显示:
- 重载配置:
sudo systemctl daemon-reload - 手动杀死 master:
sudo kill -9 $(cat /run/nginx.pid)(确保 PIDFile 正确) - 观察:
sudo systemctl status nginx是否在约 5 秒后变为 active;journalctl -u nginx -n 20是否记录重启日志 - 故意破坏配置(如注释掉一个
}),再 reload,确认告警服务是否被触发


















