Nginx 无法自拉起,必须依赖外部工具实现监控与自动恢复:首选 systemd(含配置校验与重启抑制)、次选 Keepalived(支持高可用与业务级检测)、兜底用 crontab(需人工干预防误重启)。

不能在 Nginx 自身配置文件(如 nginx.conf)里直接写“监控脚本”或实现进程自拉起——Nginx 是 Web 服务器,不是进程管理器。真正的监控与自动恢复必须由外部工具完成,比如 systemd、Keepalived、crontab 或 supervisor。下面分场景讲清楚怎么做才可靠。
用 systemd 原生支持自动重启(推荐首选)
这是最轻量、最稳定、无需额外依赖的方式,适用于所有现代 Linux 发行版(CentOS 7+/Ubuntu 16.04+)。
- 编辑服务单元文件:
/etc/systemd/system/nginx.service(若使用包管理安装,通常已有,可systemctl edit nginx覆盖补丁) - 确保包含以下关键重启策略:
-
Restart=always:只要进程退出就重启 -
RestartSec=3:重启前等待 3 秒,防抖 -
StartLimitIntervalSec=60与StartLimitBurst=3:1 分钟内最多启动 3 次,避免崩溃循环 -
ExecStartPre=/usr/sbin/nginx -t:每次启动前校验配置,失败则不启动 -
KillMode=mixed:确保 master 退出时 worker 一并清理
-
- 重载并启用:
sudo systemctl daemon-reload && sudo systemctl enable --now nginx - 验证效果:执行
sudo pkill -f "nginx: master",5 秒内应自动恢复;查日志:journalctl -u nginx -n 20
用 Keepalived 实现双机高可用 + 故障自救
适用于主备架构,不只是“拉起 Nginx”,而是能判断是否真可用(进程+端口+业务响应),再决定是重启、降权还是切 VIP。
- 编写检测脚本(例如
/etc/keepalived/check_nginx.sh):- 先检查 master 进程:
pgrep -f "nginx: master process" > /dev/null - 再 curl 本地端口:
curl -s --connect-timeout 2 -o /dev/null http://127.0.0.1/ || exit 1 - 异常时尝试
systemctl restart nginx,2 秒后复检,失败则exit 1
- 先检查 master 进程:
- 在
keepalived.conf中定义:vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh"; interval 2; weight -10; }-
track_script { check_nginx; }加入vrrp_instance块
- 这样:Nginx 挂了 → 脚本重启 → 成功则权重不变;失败则本节点优先级下降 → VIP 自动漂移到备机
用 crontab + 简单 Shell 脚本兜底(适合轻量或旧系统)
不依赖 systemd 或 Keepalived,适合最小化环境或临时应急。
- 写检测脚本(
/opt/scripts/monitor-nginx.sh):- 用
systemctl is-active --quiet nginx或pgrep -f "nginx: master"判断 - 失败时先
nginx -t,成功再systemctl restart nginx - 记录日志:
echo "$(date): restarted" >> /var/log/nginx-monitor.log
- 用
- 添加定时任务:
crontab -e,加一行:-
*/2 * * * * /bin/bash /opt/scripts/monitor-nginx.sh > /dev/null 2>&1(每 2 分钟执行)
-
- 注意:该方式无启动抑制机制,若配置错误反复重启,需人工干预
别踩坑:这些“看似能用”但实际危险的做法
以下常见误区会带来更大风险:
- 只用
ps | grep nginx判断 —— worker 还在但 master 已死,服务已不可用 - 重启前不
nginx -t—— 配置错误会导致重启失败,服务彻底中断 - 脚本里直接
kill -9再nginx启动 —— 忽略 pid 文件残留、端口占用、信号安全退出等机制 - 把监控逻辑硬塞进
nginx.conf的include或 Lua 模块 —— Nginx 不负责自身生命周期管理,属职责错位


















