使用ngx_http_vts_module搭建虚拟主机流量监控大屏,关键在于通过vhost_traffic_status_filter_by_host on和server_name唯一性实现域名级数据聚合,并配合Prometheus+Grafana或定制HTML页面实现可识别、可聚合、可展示的实时可视化。

用 ngx_http_vts_module 搭建虚拟主机流量监控大屏,关键不是堆功能,而是让每个域名的流量、状态、性能数据真正可识别、可聚合、可展示。它本身不带前端大屏,但提供稳定 JSON 接口和轻量 HTML 页面,配合 Prometheus + Grafana 就能快速产出专业级可视化看板。
确认模块已正确加载并按 server_name 区分统计
VTS 默认以 server_name 为维度聚合数据,但这依赖两个前提:每个 server 块必须有明确且唯一的 server_name(如 api.example.com、admin.internal),且模块配置中启用了主机过滤:
- 在
http块开头添加:vhost_traffic_status_zone shared:vts:64m;(内存建议从 32m 起,上百个虚拟主机建议 64m 或更高) - 启用 host 级别识别:
vhost_traffic_status_filter_by_host on; - 确保没有遗漏
load_module modules/ngx_http_vhost_traffic_status_module.so;(动态模块)或编译时已包含(静态模块) - 执行
nginx -t && nginx -s reload后,访问/status/format/json,检查返回 JSON 中serverZones对象下的键名是否与你配置的server_name一致
暴露可靠、安全的监控数据接口
大屏的数据源必须稳定、低延迟、权限可控。不要直接把 /status HTML 页面嵌入大屏,而应统一走 JSON 接口:
- 在某个
server块内(推荐独立监控子域或内网 IP)配置专用 endpoint:location /metrics/vts {<br> vhost_traffic_status_display;<br> vhost_traffic_status_display_format json;<br> allow 127.0.0.1;<br> allow 10.0.0.0/8;<br> deny all;<br>} - 避免将该 location 放在
http块顶层——否则 VTS 无法关联到具体虚拟主机,所有数据会归入""(空字符串)或default - 如需对接 Prometheus,可额外部署
nginx-vts-exporter(监听上述 JSON 接口,转换为标准 Prometheus metrics 格式,默认端口 9913)
用 Grafana 构建多维度虚拟主机看板
Grafana 是构建大屏最直接高效的方式,VTS 提供的指标足够支撑核心场景:
- 关键指标直接取自 JSON 的
serverZones字段:requestCounter(总请求数)、inBytes/outBytes(入/出流量)、responseMsec(响应时间毫秒值)、responses.2xx等状态码计数器 - 新建 Prometheus 数据源后,用 PromQL 查询各域名 QPS:
rate(nginx_vts_server_requests_total{job="nginx-vts"}[1m]) - 制作表格面板,按
server标签分组,显示实时 QPS、错误率(rate(nginx_vts_server_responses_5xx[5m]) / rate(nginx_vts_server_requests_total[5m]))、平均响应时间 - 添加 TopN 面板:用
topk(5, sum by(server)(rate(nginx_vts_server_in_bytes_total[5m])))找出带宽占用最高的 5 个域名 - 设置自动刷新(如 10s),开启全屏模式,即可作为运维大屏使用
轻量替代方案:定制化 HTML 页面直连
如果暂无 Grafana 环境,也可基于 VTS 内置 HTML 进行最小改造:
- VTS 自带
/status页面本质是 JS 渲染 JSON 数据,可复制其 HTML 源码(访问/status后右键查看源码),保存为独立 HTML 文件 - 修改 JS 中请求地址,指向你配置的
/metrics/vts接口,并加定时轮询(如每 5 秒 fetch 一次) - 用 CSS 隐藏非核心列(如缓存、filter 表格),放大字体、高亮 5xx 行、添加颜色条形图表示 QPS 强度
- 部署该 HTML 到 Nginx 静态服务下,用浏览器全屏打开,即成简易大屏










