用Prometheus+Grafana监控Nginx需打通数据链路:Nginx通过nginx-module-vts或nginx-prometheus-exporter暴露/metrics,Prometheus配置job抓取,Grafana导入面板并基于5xx错误率、活跃连接数、upstream失败等关键指标配置告警。

用 Prometheus + Grafana 监控 Nginx,核心是让 Nginx 暴露指标数据,Prometheus 定期抓取,Grafana 可视化展示并配置告警。关键不在“装一堆工具”,而在于打通数据链路、选对指标、设好阈值。
让 Nginx 输出可采集的指标
Nginx 本身不自带 /metrics 接口,需借助 nginx-module-vts(推荐)或 nginx-prometheus-exporter。前者轻量嵌入 Nginx,后者作为独立进程代理请求。
- 若编译安装 Nginx:添加
--add-module=/path/to/nginx-module-vts,启用 vhost_traffic_status_zone;再在 server 块中配置location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html; },并新增location /metrics { vhost_traffic_status_display; vhost_traffic_status_display_format prometheus; } - 若用 nginx-prometheus-exporter:启动时指定
--nginx.scrape-uri=http://localhost:8080/stub_status(需先开启 Nginx 的 stub_status),然后 Prometheus 抓取 exporter 的:9113/metrics - 验证是否生效:直接 curl http://your-nginx-ip/metrics 或 http://exporter-ip:9113/metrics,看到类似
nginx_vts_server_requests_total{server="default",code="200"} 1245的文本即成功
Prometheus 正确抓取 Nginx 指标
在 Prometheus 的 prometheus.yml 中添加 job,确保目标可达、标签清晰、抓取频率合理。
- 示例静态配置:
- job_name: 'nginx-vts' static_configs: - targets: ['192.168.1.100:80'] # Nginx 所在地址,若用 exporter 则填 exporter 地址+端口 metrics_path: /metrics params: format: [prometheus] - 加 relabel_configs 区分不同实例,比如通过
__address__提取 IP,再设instance标签:- source_labels: [__address__] target_label: instance regex: ([^:]+):.* replacement: $1 - 抓取间隔建议设为
scrape_interval: 15s,太短增加负载,太长影响告警及时性
Grafana 展示关键指标与配置告警
导入现成面板(如 ID 10272 的 “Nginx VTS Dashboard”)快速上手,再聚焦真正影响业务的指标做告警。
- 重点关注:
-
请求成功率:用
rate(nginx_vts_server_requests_total{code=~"5.."}[5m]) / rate(nginx_vts_server_requests_total[5m]) > 0.02—— 5xx 错误率超 2% 触发告警 -
连接堆积:监控
nginx_vts_server_connections_active,持续高于阈值(如 > 1000)且nginx_vts_server_connections_waiting同步上升,说明后端响应慢或连接耗尽 -
上游异常:若用了 upstream,看
nginx_vts_upstream_requests_total{code="502"}突增,可能后端挂了
-
请求成功率:用
- Grafana 告警规则写在 Alerting → Alert rules 中,选择对应数据源(Prometheus),填写表达式、评估间隔(如 1m)、持续时间(如 2m)、告警名称和描述
- 通知渠道配好 Email、企业微信或钉钉 Webhook,测试发送确保通路正常
验证与调优要点
上线后别只看图表漂亮,要模拟故障、检查告警是否触发、确认指标含义是否符合预期。
- 手动制造 502:临时停掉一个 upstream server,观察
upstream_fails_total是否上涨,告警是否在设定时间内发出 - 注意指标命名差异:vts 模块输出的是
nginx_vts_*,exporter 可能是nginx_connections_active,写 PromQL 时务必先用 Prometheus 表达式浏览器查准 metric 名 - 高并发场景下,vts 模块对性能影响极小;若用 exporter,确保它与 Nginx 同机部署减少网络延迟











