最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何结合 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 或 replaceserver标签 - 若使用 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";自定义分组逻辑