要实现Nginx虚拟主机粒度的流量监控,需确保vhost_traffic_status开启并正确配置server_name,使nginx-vts-exporter暴露含server标签的指标;Prometheus抓取时保留该标签;Grafana中通过server维度聚合查询,如topk、rate、count等实现多维分析与告警。
用 Prometheus + nginx-vts-exporter 实现 Nginx 虚拟主机(server_name)粒度的流量监控,关键在于正确暴露指标、合理配置采集,并在 Grafana 中按 host 维度拆解展示。核心不是“加个 exporter 就能看”,而是打通从 Nginx 指标暴露 → Prometheus 抓取 → 标签提取 → 可视化聚合的完整链路。
nginx-vts-exporter 本身不生成 host 维度,它只是把 Nginx vts 模块的 JSON 数据翻译成 Prometheus 格式。真正决定能否按虚拟主机区分的关键,在于 Nginx 的 vhost_traffic_status 配置是否启用且生效:
nginx-module-vts(非第三方 patch,推荐官方维护的分支)vhost_traffic_status on;
server_name(如 server_name api.example.com www.example.com;),vts 会自动以 server_name 为 key 统计/status/format/prometheus)返回的数据中,包含类似 nginx_vts_server_bytes_total{server="api.example.com",zone="default"} 这样的带 server 标签的指标默认 scrape 配置不会丢弃 exporter 返回的 labels,但需检查两点避免维度丢失:
metric_relabel_configs 错误地 drop 或 replace server 标签targets: ['nginx-exporter:9913'] 即可;若通过服务发现,确保 target 标签未覆盖原始指标标签nginx_vts_server_bytes_total,展开 Series 查看是否真实存在多个 server="xxx" 的时间序列有了带 server 标签的指标,Grafana 查询就非常直接。常用场景示例:
topk(5, sum by(server) (rate(nginx_vts_server_bytes_total{code=~"2.."}[5m]))),显示响应成功字节数最高的 5 个域名sum by(server) (rate(nginx_vts_server_bytes_total[1h])),再开启 “Relative time” 或用 offset 24h 叠加曲线count by(server) (nginx_vts_server_requests_total{code=~"5.."} > 0),找出最近有 5xx 的域名server 标签值列表,实现下拉切换查看指定虚拟主机详情生产环境建议叠加几项优化:
vhost_traffic_status_zone 显式命名 zone,避免默认 zone 冲突/healthz),并在 Prometheus 中配置 up == 0 告警,防止 exporter 宕机导致数据中断vhost_traffic_status_filter_by_host on; 开启 host 过滤,避免指标爆炸*.example.com),vts 默认不聚合到具体 host,此时需改用 vhost_traffic_status_filter_by_set_key $host "backend"; 自定义分组逻辑