Nginx服务存活监控与宕机告警可通过Shell脚本+curl定期探测HTTP响应,失败达阈值后发邮件、写日志或调用Webhook;配合crontab每分钟执行,并需重试机制、健康接口验证及flock防并发。

在 Nginx 环境中实现服务存活监控和宕机告警,核心思路是:用脚本定期探测 Nginx 是否响应 HTTP 请求(或监听端口),失败次数达到阈值后触发告警(如发邮件、写日志、调用 Webhook)。不需要复杂组件,纯 Shell + curl 或 wget 就能搞定。
一、基础存活检查脚本(curl 方式)
最常用的是通过 curl 访问 Nginx 的健康接口或首页,检查返回状态码是否为 200。建议使用 --fail 和 --silent --output /dev/null 避免输出干扰:
#!/bin/bash URL="http://127.0.0.1:80" TIMEOUT=5 ATTEMPTS=3 <p>for i in $(seq 1 $ATTEMPTS); do if curl -f -s -m $TIMEOUT "$URL" >/dev/null 2>&1; then echo "$(date): Nginx is UP" exit 0 fi sleep 1 done</p><p>echo "$(date): Nginx is DOWN after $ATTEMPTS attempts"</p><h1>这里插入告警逻辑</h1><p>
二、宕机时触发告警的常用方式
检测失败后,可选择以下一种或多种方式通知:
-
发邮件:用
mail命令(需配置 sendmail 或 msmtp),例如:echo "Nginx down at $(date)" | mail -s "ALERT: Nginx Down" admin@example.com -
写入本地告警日志:便于后续用 logrotate 或 ELK 收集
echo "$(date) [ERROR] Nginx unreachable" >> /var/log/nginx_monitor.log -
调用企业微信/钉钉 Webhook:适合团队协作场景,需提前获取机器人地址
curl -X POST "https://qyapi.weixin.qq.com/..." -H 'Content-Type: application/json' -d '{"msgtype":"text","text":{"content":"Nginx 服务异常,请检查!"}}'
三、通过 crontab 定期执行监控
将脚本保存为 /opt/scripts/check_nginx.sh,赋予执行权限:chmod +x /opt/scripts/check_nginx.sh
然后添加到 crontab(每 30 秒太频繁,建议最小粒度为 1 分钟):
# 每分钟检查一次(注意:cron 最小精度是 1 分钟) * * * * * /opt/scripts/check_nginx.sh >> /var/log/nginx_check.log 2>&1
⚠️ 注意:如果需要亚秒级检测(如 10 秒一次),可用 while true; do ...; sleep 10; done & 启动后台循环,但要加进程守护防止退出。
四、增强健壮性的关键细节
-
不要只依赖 HTTP 返回码:某些情况下 Nginx 还在运行但 upstream 全挂了,返回 502。可在 URL 中加一个真实后端健康检查路径(如
/healthz),由后端主动返回 200 -
区分“Nginx 进程存活”和“服务可用”:仅用
pgrep nginx不够,必须验证网络可达性和响应内容 - 避免误报:设置重试次数(如 3 次)+ 延迟,避开瞬时网络抖动;同时记录成功恢复时间,防止重复告警
-
加锁防并发:多个 cron 实例可能同时运行,用
flock包裹脚本主体更安全flock -n /tmp/nginx_check.lock -c "/opt/scripts/check_nginx.sh"


















