Nginx Prometheus监控落地需三步:一是通过nginx-module-vts模块暴露/metrics接口;二是Prometheus配置合理job与relabel打标并设15s抓取间隔;三是基于业务设5xx错误率、活跃连接数、upstream失败、P95延迟等精准告警阈值。

要让 Nginx 的 Prometheus 监控真正落地,关键不是堆工具,而是把指标采集通路打通、选准核心指标、设对告警逻辑。下面从实操角度分三步讲清楚。
让 Nginx 暴露可用的指标数据
Nginx 原生不输出 /metrics,必须借助扩展模块。目前主流且推荐的是 nginx-module-vts,它轻量、指标全、无需额外进程:
- 编译安装时加入
--add-module=/path/to/nginx-module-vts,并在 http 块中启用vhost_traffic_status_zone - 在 server 块中添加两个 location:
-
location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html; }(供人工查看) -
location /metrics { vhost_traffic_status_display; vhost_traffic_status_display_format prometheus; }(供 Prometheus 抓取)
-
- 验证是否生效:执行
curl http://your-nginx-ip/metrics,看到类似nginx_vts_server_requests_total{server="default",code="200"} 1245的行即成功
若已用 stub_status,也可搭配官方 nginx-prometheus-exporter(监听 :9113/metrics),但多一层依赖,生产环境优先选 vts 模块。
Prometheus 稳定抓取并打标
在 prometheus.yml 中配置 job,重点是目标可达、标签清晰、频率合理:
- 静态配置示例(适配 vts):
- job_name: 'nginx-vts' static_configs: - targets: ['192.168.1.100:80'] metrics_path: /metrics params: format: [prometheus] - 加 relabel 规则区分实例,例如提取 IP 作为 instance 标签:
- source_labels: [__address__] target_label: instance regex: ([^:]+):.* replacement: $1
- 抓取间隔建议设为
scrape_interval: 15s;太短加重 Nginx 和 Prometheus 负担,太长影响告警时效性
基于真实业务设告警阈值
告警不是越多越好,应聚焦影响服务可用性的指标。以下为生产环境常用组合:
-
5xx 错误率突增:
rate(nginx_vts_server_requests_total{code=~"5.."}[5m]) / rate(nginx_vts_server_requests_total[5m]) > 0.01(持续 2 分钟超 1%) -
活跃连接数过高:
nginx_vts_server_connections_active > 500(结合服务器规格调整,如 4C8G 可设为 800) -
Upstream 失败激增:
rate(nginx_vts_upstream_requests_total{code="502"}[5m]) > 5(每分钟 502 达 5 次即告警) -
请求延迟恶化:
histogram_quantile(0.95, rate(nginx_vts_server_request_seconds_bucket[5m])) > 1(P95 响应时间超 1 秒)
所有告警规则需接入 Alertmanager,并配置分组、静默与通知渠道(如企业微信、钉钉)。不复杂但容易忽略。


















