Nginx 与 Prometheus 监控打通需理清指标来源、采集、可视化和告警四步:Nginx 借助 nginx-module-vts 或 nginx-prometheus-exporter 暴露 Prometheus 格式指标;Prometheus 通过正确配置 job 抓取;Grafana 可视化并基于核心指标(连接、请求质量、upstream 健康等)设置合理告警。

要让 Nginx 和 Prometheus 真正打通监控链路,关键不是堆工具,而是把“指标从哪来、怎么采、怎么看、怎么告”这四步理清楚。Nginx 本身不输出 Prometheus 格式数据,必须靠扩展模块或导出器暴露指标;Prometheus 要能稳定拉取;Grafana 才能画图和设阈值告警。
让 Nginx 暴露标准指标数据
Nginx 原生没有 /metrics 接口,必须借助外部能力:
-
推荐用 nginx-module-vts:编译时加入该模块后,直接在配置中加一段 location 就能暴露 Prometheus 格式指标,比如:
location /metrics {<br> vhost_traffic_status_display;<br> vhost_traffic_status_display_format prometheus;<br>}
它支持虚拟主机、upstream、缓存等维度,指标丰富且轻量。 -
备选 nginx-prometheus-exporter:适用于已启用
stub_status的环境(需确认 Nginx 编译含--with-http_stub_status_module)。Exporter 作为独立进程,定期请求/nginx_status,再转换为 Prometheus 指标,默认监听:9113/metrics。 - 验证是否生效:用
curl http://your-nginx-ip/metrics或curl http://exporter-ip:9113/metrics,看到类似nginx_vts_server_requests_total{server="default",code="200"} 1245的纯文本行即成功。
Prometheus 正确抓取并区分实例
在 prometheus.yml 中新增 job,重点注意三点:
- 目标地址填对:若用 vts 模块,填 Nginx 实际地址(如
192.168.1.100:80);若用 exporter,填 exporter 地址(如192.168.1.100:9113)。 - 明确路径与参数:
metrics_path: /metricsparams: { format: ["prometheus"] } - 加 relabel 区分多实例:比如从
__address__提取 IP 作为instance标签:- source_labels: [__address__]<br> target_label: instance<br> regex: ([^:]+):.*<br> replacement: $1
- 抓取间隔建议设为
15s:太短加重 Nginx 和 Prometheus 负担,太长影响告警响应速度。
聚焦核心指标做有效监控
不是所有指标都值得告警,优先关注直接影响服务可用性和性能的几类:
-
连接状态:如
nginx_connections_active(活跃连接)、nginx_connections_waiting(空闲等待连接),突增可能预示连接池打满或后端卡顿。 -
请求质量:如
nginx_http_requests_total按code分组统计,重点关注code="5xx"的比率;nginx_up == 0表示指标采集失败,本身就是故障信号。 -
Upstream 健康度:若用了反向代理,看
nginx_vts_upstream_fails_total和nginx_vts_upstream_health_checks_failed,及时发现节点失联或健康检查失败。 -
虚拟主机粒度:vts 模块支持按
server或upstream标签拆分指标,便于定位具体业务域名或服务集群的问题。
Grafana 可视化与告警配置要点
导入现成面板只是起点,真正有用的是结合业务调优:
- 使用官方或社区成熟面板(如 ID 11728 的 Nginx VTS Dashboard),再按需删减或叠加自定义图表。
- 告警规则写在 Prometheus 的
alert.rules.yml中,例如:expr: 100 * sum(rate(nginx_http_requests_total{code=~"5.."}[5m])) by (instance) / sum(rate(nginx_http_requests_total[5m])) by (instance) > 2<br>for: 3m<br>labels:<br> severity: warning<br>annotations:<br> summary: "High 5xx error rate on {{ $labels.instance }}" - 阈值不能拍脑袋定:先观察一周基线,比如 5xx 错误率日常低于 0.1%,那设 2% 就比较合理;QPS 阈值可参考历史峰值的 80%。


















