需监控upstream健康与连接数,因nginx不直接暴露节点健康分和实时活跃连接数,须通过stub_status、upstream_check_module及nginx-prometheus-exporter协同采集结构化指标,实现可告警、可下钻的精细化运维。

为什么需要监控 Upstream 健康与连接数
后端服务稳定性直接影响用户请求成功率。Nginx 本身不直接暴露 Upstream 节点的健康分(如基于失败次数、超时、响应码动态计算的权重分)和实时活跃连接数,而 Prometheus 擅长采集指标但无法主动探活或获取 Nginx 内部状态。必须通过 Nginx 的 stub_status 和 upstream_check_module(或官方 stream/upstream health check)配合 exporter 暴露结构化指标,才能实现真正可告警、可下钻的监控。
关键组件准备与配置要点
需启用 Nginx 的健康检查能力并导出指标:
- 编译或使用支持健康检查的 Nginx:推荐 openresty 或打过 upstream_check_module 补丁的 Nginx;若用 Nginx Plus 可直接用内置 health_check 指令
-
开启 stub_status 并暴露 upstream 状态:在 server 块中添加
location /nginx_status { stub_status; },同时确保upstream_check在 upstream 块中启用(如check interval=3 rise=2 fall=3 timeout=1 type=http) -
部署 nginx-prometheus-exporter:运行官方 nginx-prometheus-exporter,它会定期抓取
/nginx_status和/upstream_status(需 upstream_check_module 提供)并转为 Prometheus 格式指标
核心指标识别与 PromQL 示例
Exporter 暴露的关键指标包括:
-
nginx_upstream_server_healthcheck_failures_total{upstream="backend",server="10.0.1.10:8080"}—— 累计失败次数,用于判断节点是否持续异常 -
nginx_upstream_server_healthcheck_fails_current{...}—— 当前连续失败次数,配合fall阈值(如 fall=3)可触发下线预警 -
nginx_upstream_server_active_connections{...}—— 实时活跃连接数,反映瞬时负载压力 -
nginx_upstream_server_weight{...}和nginx_upstream_server_max_fails{...}—— 结合可推算“健康分”,例如:100 - (nginx_upstream_server_healthcheck_fails_current / nginx_upstream_server_max_fails * 100)(归一化为 0–100 分)
实战告警与可视化建议
在 Prometheus 中配置以下典型规则:
-
节点健康分低于 60:
100 - (nginx_upstream_server_healthcheck_fails_current / nginx_upstream_server_max_fails * 100) → 触发 P2 告警 -
单节点连接数突增 300%:
rate(nginx_upstream_server_active_connections[5m]) > 3 * rate(nginx_upstream_server_active_connections[1h] offset 1h) -
上游整体可用率下降:
count by (upstream) (nginx_upstream_server_healthcheck_fails_current == 0) / count by (upstream) (nginx_upstream_server_healthcheck_fails_current)
Grafana 中可构建“Upstream 健康热力图”(X=节点,Y=时间,颜色=健康分)、“连接数趋势叠加图”(各节点曲线+总量虚线),辅助快速定位抖动源。











