一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何结合 Prometheus 的 nginx-vts-exporter 模块实现图形化多维度虚拟主机流量监控

时间:2026-06-18 09:17:52 编辑:袖梨 来源:一聚教程网

要实现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-exporter 本身不生成 host 维度,它只是把 Nginx vts 模块的 JSON 数据翻译成 Prometheus 格式。真正决定能否按虚拟主机区分的关键,在于 Nginx 的 vhost_traffic_status 配置是否启用且生效:

  • 确认 Nginx 已编译并启用了 nginx-module-vts(非第三方 patch,推荐官方维护的分支)
  • 在 http 块中开启状态模块:vhost_traffic_status on;
  • 确保每个 server 块有明确的 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 标签的指标

Prometheus 抓取配置需保留原始标签

默认 scrape 配置不会丢弃 exporter 返回的 labels,但需检查两点避免维度丢失:

  • 确认 job 配置中没有使用 metric_relabel_configs 错误地 drop 或 replace server 标签
  • 若使用 static_configs,直接写:targets: ['nginx-exporter:9913'] 即可;若通过服务发现,确保 target 标签未覆盖原始指标标签
  • 抓取后可在 Prometheus 表达式浏览器输入 nginx_vts_server_bytes_total,展开 Series 查看是否真实存在多个 server="xxx" 的时间序列

Grafana 中按虚拟主机做多维聚合与对比

有了带 server 标签的指标,Grafana 查询就非常直接。常用场景示例:

  • 各 host 流量 TopN 排行:用 topk(5, sum by(server) (rate(nginx_vts_server_bytes_total{code=~"2.."}[5m]))),显示响应成功字节数最高的 5 个域名
  • 单 host 流量趋势对比(今日 vs 昨日):用 sum by(server) (rate(nginx_vts_server_bytes_total[1h])),再开启 “Relative time” 或用 offset 24h 叠加曲线
  • 异常 host 快速定位:查 count by(server) (nginx_vts_server_requests_total{code=~"5.."} > 0),找出最近有 5xx 的域名
  • 面板变量可设为 server 标签值列表,实现下拉切换查看指定虚拟主机详情

补充建议:提升稳定性与可观测性

生产环境建议叠加几项优化:

  • 在 Nginx server 块中添加 vhost_traffic_status_zone 显式命名 zone,避免默认 zone 冲突
  • 给 nginx-vts-exporter 加 health check(如 /healthz),并在 Prometheus 中配置 up == 0 告警,防止 exporter 宕机导致数据中断
  • 对高频小站(如大量泛解析子域名),可通过 vhost_traffic_status_filter_by_host on; 开启 host 过滤,避免指标爆炸
  • 如果 server_name 是通配符(如 *.example.com),vts 默认不聚合到具体 host,此时需改用 vhost_traffic_status_filter_by_set_key $host "backend"; 自定义分组逻辑

热门栏目