VTS模块是实现server_name维度多维流量监控的核心方案:通过编译加载vts模块、在http块启用vhost_traffic_status、为各server配置唯一server_name,即可在/status页面按域名展示请求数、状态码、带宽、响应时间等指标,并支持JSON接口对接Prometheus与Grafana实现长期存储和可视化。

要实现基于 server_name 维度的多维度流量监控视图,核心是让 Nginx 能按虚拟主机(即不同域名)分别统计请求量、响应时间、状态码、带宽等指标,并通过可视化界面直观呈现。Nginx 官方不内置此类细粒度监控能力,需借助第三方模块 VTS(Virtual Host Traffic Status)并合理配置。
编译安装含 VTS 模块的 Nginx
VTS 不在 Nginx 默认模块中,需从源码编译时显式添加。推荐使用稳定分支(如 nginx-1.24.x + vts-0.1.18):
- 下载 Nginx 源码和 vts 模块(GitHub 上搜索
nginx-module-vts) - 解压后进入 Nginx 源码目录,执行:
./configure --add-module=/path/to/nginx-module-vts --with-http_ssl_module -
make && sudo make install,默认安装到/usr/local/nginx - 验证是否加载成功:
/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o vts应输出vts
配置 VTS 模块启用 server\_name 级监控
VTS 默认按 upstream 分组统计,要按 server_name 维度区分,关键在于:每个 server 块必须有唯一且明确的 server_name,且 VTS 配置需放在 http 块中并开启 vhost_traffic_status on:
- 在
http块顶部添加:vhost_traffic_status on;<br>vhost_traffic_status_display on;<br>vhost_traffic_status_display_format html;
- 确保各
server块中server_name不为空、不重复,例如:server { listen 80; server_name api.example.com; ... }server { listen 80; server_name www.example.com; ... } - VTS 会自动将每个
server_name作为独立虚拟主机条目,无需额外映射或标签配置
访问监控页面并理解 server\_name 维度数据
启动 Nginx 后,访问 http://your-nginx-ip/status 即可看到 HTML 格式总览页,点击顶部 Server Zones 标签页,即可看到所有 server_name 列表及其独立指标:
- 每行对应一个
server_name,显示实时请求数(Req)、成功响应(2xx)、重定向(3xx)、客户端错误(4xx)、服务端错误(5xx)、入/出流量(In/Out)、平均响应时间(RT)等 - 支持点击单个
server_name进入详情页,查看该域名下各 URI 的请求分布、状态码热力图、响应时间趋势(需配合 JS 渲染) - 所有数据基于内存实时聚合,无外部依赖,刷新页面即更新
对接 Prometheus 实现长期存储与告警
VTS 提供 JSON 接口(/status/format/json),可被 Prometheus 抓取。只需部署 nginx-vts-exporter(Go 编写的轻量适配器):
- 运行 exporter 并指向 Nginx 的
/status/format/json接口 - 在 Prometheus 中配置 job 抓取 exporter 的
/metrics端点 - 关键指标已自动打标
vhost标签,值即为server_name,例如:nginx_vts_server_requests_total{vhost="api.example.com", code="200"} - 配合 Grafana 可构建按域名筛选的看板,比如对比
www和api的错误率、P95 响应延迟变化











