VTS模块可直接实现按虚拟主机划分的实时QPS、带宽和错误率看板,无需额外埋点或代理层;关键在于精准配置vhost_traffic_status_zone、启用filter_by_host、正确声明server_name、合理部署location /status,并通过JSON接口对接Prometheus与Grafana。

直接用 VTS 模块就能做出按虚拟主机划分的实时 QPS、带宽和错误率看板,不需要额外埋点或代理层。关键在配置精准、数据可分、接口可用——不是装上就出图,而是每一步都得对得上。
vhost_traffic_status_zone 是数据分片的根基
VTS 不会自动按 server_name 归类流量,必须显式声明共享内存区并绑定到具体上下文。否则所有请求都堆进 default 或 unknown。
- 每个 server 块里加一行:
vhost_traffic_status_zone backend_api;,zone 名建议用业务标识,不能重复 - 如果用了 upstream,对应 upstream 块也要加同名 zone:
upstream api_cluster { vhost_traffic_status_zone api_cluster; } - 若 proxy_pass 含变量(如
proxy_pass http://$backend),VTS 无法解析,流量全归 unknown —— 改成固定 upstream 名称或用 map 预定义
按 host 精确聚合需开启 filter_by_host
默认情况下,/status/format/json 返回的数据中 serverZones 的 key 是 zone 名,不是域名。要让指标真正按虚拟主机呈现,得启用 host 过滤。
- 在 http 块顶部加:
vhost_traffic_status_filter_by_host on; - 确保每个 server 的
server_name设置明确,不写通配符(如*.example.com)会导致部分匹配失败 - 验证方式:访问
/status/format/json,检查serverZones下是否出现你配置的域名(如"example.com"),而不是"default"或"unknown"
HTML 看板与 JSON 接口的实用配置要点
浏览器打开 /status 页面卡顿、空白或 404,多数是路由或上下文错位导致的,不是模块没加载。
-
location /status必须写在 server 块内,不能放在 http 顶层;且 URI 严格匹配,不能带斜杠 - HTML 页面本质是前端渲染全量状态树,上百个虚拟主机时极易卡死——生产环境建议关闭 HTML,只留 JSON 接口供 Prometheus 抓取
- JSON 接口推荐加限流或白名单:
limit_req zone=vts_api burst=5 nodelay;,防止监控轮询压垮 Nginx - 确认模块生效最快速的方法:curl -s http://127.0.0.1/status/format/json | head -20,有 JSON 输出即运行正常
对接 Prometheus + Grafana 的最小可行路径
不用 nginx-vts-exporter 也能直接喂给 Prometheus,前提是 JSON 接口稳定且字段可映射。
- Prometheus 配置 job,target 设为
http://nginx-host:80/status/format/json - 用 relabel_configs 提取
serverZones.*.requestCounter作为 QPS,serverZones.*.inBytes和outBytes算带宽,serverZones.*.responseCodes.5xx算错误率 - Grafana 中用
rate(nginx_vts_server_requestCounter{job="nginx"}[1m])得到每秒请求数,配合label_values(serverZones)实现下拉筛选 - 错误率公式示例:
rate(nginx_vts_server_responseCodes_5xx{job="nginx"}[5m]) / rate(nginx_vts_server_requestCounter{job="nginx"}[5m])

















