nginx需通过nginx_upstream_check_module主动探测后端健康接口,并结合nginx-module-vts暴露状态,再经nginx-vts-exporter接入prometheus实现自动告警。

要让 Nginx 真实感知 upstream 后端节点是否健康,并触发自动告警,不能只靠连接通断,必须组合主动探测、结构化状态暴露和监控闭环。开源版 Nginx 本身不带原生健康检查能力,需依赖扩展模块或工具链协同实现。
用 nginx_upstream_check_module 做主动探测
这是最成熟、轻量且生产验证过的方案。先确认模块已启用:
nginx -V | grep upstream_check
- 在 upstream 块中开启 HTTP 探针,指向后端真实的健康接口(如 /health 或 /actuator/health)
- 发送带 Host 头的请求,避免路由错误:
check_http_send "GET /health HTTP/1.1\r\nHost: api.example.com\r\nConnection: close\r\n\r\n" - 只把 2xx 视为健康:
check_http_expect_alive http_2xx - 禁用原生被动机制干扰:
max_fails=0 fail_timeout=0 - 加 default_down=true,防止启动时误判未就绪节点
暴露机器可读的状态数据
光探测不行,得把结果“说出来”,让 Prometheus 能采集。
- 推荐使用 nginx-module-vts(Virtual Host Traffic Status),它提供 /status/format/json 接口,字段含每个节点的 status、healthcheck、response_time、fails 等
- 配置受保护的 status 页面,限制访问来源:
location /status { vhost_traffic_status_display; vhost_traffic_status_display_format json; allow 10.0.0.0/8; deny all; } - 切勿开放给公网——状态页泄露后端拓扑、IP 和故障历史,属敏感信息
对接 Prometheus 实现自动告警
把 Nginx 的健康状态纳入统一监控体系,才能真正触发响应。
- 部署 nginx-vts-exporter,它会定期抓取 VTS 的 JSON 数据并转成 Prometheus 格式指标
- 在 Prometheus 中配置 job 抓取 exporter 的 /metrics
- 设置两类关键告警规则:
— 某节点连续 5 分钟失败次数 > 0:
nginx_upstream_healthcheck_failures_total{upstream="api"} > 0
— 健康节点数低于最低可用阈值:
count by (upstream) (nginx_upstream_healthcheck_status{status="up"} == 1) - 告警通过 Alertmanager 转发至钉钉或企业微信,附带节点 IP、最近响应码、失败次数等上下文
轻量替代方案:日志 + 脚本告警
如果暂时无法引入新组件,可用 Nginx 自身能力快速落地:
- 在 error_log 中记录 upstream 连接失败事件:
error_log /var/log/nginx/upstream_error.log warn; - 用 filebeat 或自定义脚本实时解析日志,提取 upstream timed out、no live upstreams 等关键词
- 检测到连续 3 次失败,立即调用 curl 发送告警消息到 webhook
- 优点是零编译、零新服务;缺点是延迟略高、无法区分语义失败(如返回 200 但内容异常)











