nginx开源版不支持内置告警,需借助nginx plus api轮询、prometheus+exporter告警或自定义脚本监控状态页实现后端故障通知,同时注意避免误报、支持恢复通知并测试链路。

Nginx 本身不内置告警通知功能,健康检查(如 health_check 指令或 upstream 中的 max_fails/fail_timeout)只负责探测和流量调度,**不支持直接发邮件、短信或调用 Webhook**。要实现“后端故障时发送提醒”,需借助外部工具或自定义方案。
使用 Nginx Plus 的原生健康检查告警
如果你使用的是商业版 Nginx Plus(非开源 Nginx),它提供完整的主动健康检查 + 实时状态 API + 告警集成能力:
- 配置主动健康检查:
upstream backend { zone backend 64k; server 192.168.1.10:8080; server 192.168.1.11:8080; health_check interval=3 fails=2 passes=2; } - 通过
/api/5/nginx/health_checks或/api/5/nginx/upstreams/<name>/peers</name>获取实时状态 - 配合脚本轮询 API,当
health_checks.unhealthy或state变为unhealthy时触发通知(如调用 curl 发送企业微信/钉钉 Webhook)
开源 Nginx + 外部监控工具(推荐)
对开源 Nginx,最可靠的方式是引入轻量级监控系统,监听其健康状态并统一告警:
-
Prometheus + nginx-vts-exporter 或 nginx-prometheus-exporter:采集 upstream peer 状态(如
nginx_upstream_peers_health指标) -
配置 Prometheus Alert Rules,例如:
groups: - name: nginx-health-alerts rules: - alert: BackendUnhealthy expr: nginx_upstream_peers_health{upstream="backend"} == 0 for: 30s labels: severity: critical annotations: summary: "Backend peer is unhealthy" description: "Upstream {{ $labels.peer }} in {{ $labels.upstream }} has been unhealthy for 30s" - Alertmanager 接收告警后,可配置邮件、企业微信、飞书、Slack 等通知渠道
简易脚本轮询 + 状态文件 + 告警(适合小规模)
若不想引入完整监控栈,可用 shell 脚本定期检查 Nginx 状态页(需启用 stub_status 或 status 模块):
- 启用第三方模块如 nginx-module-vts,暴露 JSON 状态页(
/status/format/json) - 写定时脚本解析该接口,提取
upstreams.backend.peers[].down或health字段 - 发现异常且此前正常(可记录上一次状态到临时文件作对比),则执行
curl -X POST推送消息到钉钉机器人等 - 示例判断逻辑(伪代码):
if [ "$current_down" = "true" ] && [ "$last_down" = "false" ]; then send_alert "Backend $peer is DOWN" echo "$current_down" > /tmp/nginx_peer_status fi
关键注意事项
-
避免误报:设置合理
fails/passes和间隔,配合for持续时间(如 Prometheus 中的for: 30s) - 恢复通知也重要:告警系统应支持“resolved”事件,避免只报障不报修
- 不要依赖 access_log 做健康判断:日志延迟高、无实时性,且无法区分是后端挂了还是网络抖动
- 测试告警链路:手动下线一个后端,验证是否真正收到通知











