VTS模块是实现server_name维度Nginx流量监控与可视化的关键方案:支持按域名统计请求量、状态码、流量、响应时间等指标,提供JSON/API和HTML页面,需启用vhost_traffic_status_filter_by_host on并正确配置server_name。

要实现基于 server_name 维度的 Nginx 流量监控与可视化展示,核心是使用 Nginx VTS(Virtual Host Traffic Status)模块,它能按虚拟主机(即每个 server 块的 server_name)统计请求量、响应状态码、流量带宽、连接数等关键指标,并提供 JSON 接口和内置 HTML 页面。
一、编译安装支持 VTS 的 Nginx
VTS 不是官方模块,需在编译 Nginx 时手动添加。推荐使用主流稳定版本(如 Nginx 1.20+),并确保系统已安装编译依赖(gcc、make、pcre-devel、zlib-devel、openssl-devel)。
操作步骤:
- 克隆 VTS 模块源码:
git clone https://github.com/vozlt/nginx-module-vts.git - 下载对应 Nginx 源码(如
nginx-1.22.1.tar.gz),解压后进入目录 - 执行配置命令(路径按实际调整):
./configure --add-module=/path/to/nginx-module-vts --with-http_ssl_module --with-http_gzip_static_module - 运行
make && sudo make install
验证是否加载成功:nginx -V 2>&1 | grep -o vts 应输出 vts。
二、Nginx 配置启用 VTS 并按 server_name 区分统计
在 http 块中启用 VTS 模块,并为每个 server 块设置唯一且有意义的 server_name(如 api.example.com、www.example.com)。VTS 默认即按 server_name 自动聚合数据,无需额外标记。
示例配置片段:
http {
vhost_traffic_status_zone; # 必须声明,启用统计区
vhost_traffic_status_filter_by_host on; # 关键:开启按 host(即 server_name)过滤
<pre class="brush:php;toolbar:false;">server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend_api;
}
}
server {
listen 80;
server_name www.example.com;
location / {
root /var/www/html;
}
}
# 暴露监控页面和 API(建议加访问控制)
server {
listen 127.0.0.1:8080;
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html; # 或 json
}
location /status/format/json {
vhost_traffic_status_display;
vhost_traffic_status_display_format json;
}
}}
注意:vhost_traffic_status_filter_by_host on 是实现 server_name 维度统计的关键开关;若关闭,所有 server 将合并为一个默认组。
三、访问监控数据与解读 server_name 维度指标
重启 Nginx 后,可通过以下地址查看:
- HTML 页面:
http://127.0.0.1:8080/status—— 直观表格,每行对应一个server_name,显示总计数、实时 QPS、2xx/4xx/5xx 分布、接收/发送字节数等 - JSON 接口:
http://127.0.0.1:8080/status/format/json—— 返回结构化数据,serverZones字段下以server_name为 key,值为该域名全部指标对象
JSON 示例节选:
"serverZones": {
"api.example.com": {
"requestCounter": 12489,
"inBytes": 32456789,
"outBytes": 189045672,
"responses": { "1xx": 0, "2xx": 11234, "3xx": 45, "4xx": 876, "5xx": 34 },
"requestMsecCounter": 12489,
"requestMsec": 145.6
},
"www.example.com": { ... }
}
该结构天然支持按域名做聚合分析、告警阈值设定或对接 Grafana(通过 Prometheus Exporter 或直接调用 JSON)。
四、生产环境实用建议
为保障稳定性与安全性,上线前注意:
- 监控端口(如 8080)严禁暴露到公网,务必用
allow 127.0.0.1+deny all或反向代理加 Basic Auth - VTS 本身轻量,但高频轮询 JSON 接口可能增加 CPU 开销,建议采集间隔 ≥ 10s
- 若使用 Nginx Plus,原生支持更丰富的虚拟主机级监控,无需 VTS;社区版场景下 VTS 是成熟可靠的选择
- 配合
log_format和map指令,可进一步将server_name注入 access_log,用于日志侧交叉验证
不复杂但容易忽略:确保所有 server 块都有明确且唯一的 server_name,通配符(如 *.example.com)也能被识别,但泛域名建议搭配 server_name_in_redirect off 避免重定向歧义。











