要让Grafana清晰展示不同虚拟主机流量占比,需三步:1. Nginx启用ngx_http_vhost_traffic_status_module并显式配置server_name;2. 用nginx-vts-exporter将VTS指标转为Prometheus格式;3. Grafana中用sum by(server)和topk等PromQL实现饼图、趋势图与环比告警。

要让 Grafana 清晰展示不同虚拟主机的流量占比分布,核心是确保 Nginx 能按 server_name 准确归集数据,并在 Grafana 中用合适图表表达“谁占多少、变化如何”。不依赖日志解析,而是用 ngx_http_vts_module 提供的原生维度最稳定、延迟最低。
确保 VTS 正确识别每个虚拟主机
VTS 不会自动按域名分组,必须显式配置三处,否则所有流量都堆在 default 或 unknown:
- 在
http块顶部加载模块:load_module modules/ngx_http_vhost_traffic_status_module.so; - 声明共享内存区(命名+大小):
vhost_traffic_status_zone shared:vts:10m;—— 名称vts后续 exporter 和查询要用 - 每个
server块开头加vhost_traffic_status on;,且该server必须有明确server_name(如www.example.com)
验证方式:访问 http://localhost:8080/status/format/json,检查 serverZones 下是否列出你配置的各个域名,且 requestCounter、inBytes 等字段非零。
用 Prometheus + nginx-vts-exporter 拉取结构化指标
VTS 自带 JSON 接口,但 Grafana 不能直接查它。需通过 nginx-vts-exporter 把 JSON 转成 Prometheus 格式指标:
- 启动 exporter 时指定 VTS 地址:
./nginx-vts-exporter -nginx.scrape_uri http://127.0.0.1:8080/status/format/json - Prometheus 的
scrape_configs加 job,目标为 exporter 地址(如localhost:9913/metrics) - 关键指标已自动带标签:
nginx_vts_server_bytes_total{server="api.example.com", direction="in"}就是该域名入向字节数
Grafana 中构建占比分布看板
数据就绪后,在 Grafana 面板中直接用 Prometheus 数据源,避免手动计算:
-
饼图(当前占比):查询语句用
sum by(server) (rate(nginx_vts_server_bytes_total{direction="in"}[5m])),图例字段设为server,Grafana 自动算百分比 -
TOP5 流量趋势(最近1小时):用
topk(5, sum by(server) (rate(nginx_vts_server_bytes_total{direction="in"}[5m]))),时间范围选 “Last 1 hour”,图形设为折线图 -
环比告警基线:对每个
server计算(current_5m_rate / previous_5m_rate) > 3且current_5m_rate > 2e6(即超 2MB/s),在 Prometheus rules 中定义,Grafana 显示为状态面板或告警列表
补充:区分静态/动态流量可叠加打标
如果想进一步拆解某域名内资源类型占比(如 /static vs /api),不用改日志格式,直接在对应 server 块里加:
set $route "$server_name:$request_uri";<br>vhost_traffic_status_filter_by_set_key $route route::$server_name;
这样 JSON 接口会出现 "route::api.example.com:/api/v1/users" 这类键,Prometheus 指标也会带上 route 标签,Grafana 可按此做二级下钻分析。


















