需显式配置vhost_traffic_status_zone并启用filter_by_set_key打标,结合Prometheus格式暴露,才能获取租户、地域、路径等细粒度指标。

要获取更细粒度的虚拟主机监控指标,不能只依赖 ngx_http_vts_module 默认按 server_name 的粗粒度聚合。它本身支持多层打标与分组能力,关键在于主动配置过滤逻辑和结构化输出路径,而非等待“自动识别”。
必须启用 vhost_traffic_status_zone 并显式命名
该指令是整个模块的数据底座,不声明或声明错误会导致所有统计失效(连 /status 都 404)。
- 必须放在
http块顶层,例如:vhost_traffic_status_zone shared:vts:10m; -
shared:后的名称(如vts)需唯一,后续 filter、upstream zone 都依赖它关联; - 内存大小建议 ≥5m(单机百域名场景下 10m 更稳妥),太小会丢计数。
用 filter_by_set_key 实现业务维度拆分
默认只按 server_name 分组,但实际需要按租户、接口类型、地域等切片。核心是 vhost_traffic_status_filter_by_set_key 指令,它把任意变量值拼进 zone 键名,让 JSON 中出现新条目:
按客户 ID(来自 URL 参数
?cid=abc123):vhost_traffic_status_filter_by_set_key $arg_cid client::$server_name;
→ JSON 中会出现"client::api.example.com"这类 zone。按国家(需先加载 GeoIP 模块):
vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;
→ 可对比CN::www.site.com和US::www.site.com的响应时间差异。-
按请求路径前缀分类:
set $route "$server_name:$request_uri"; vhost_traffic_status_filter_by_set_key $route route::$server_name;
→ 自动区分
/api/v1/和/static/的流量占比与错误率。
注意:这些指令必须写在 server 块内,且在 location 外(即作用于整个 server 的所有请求)。
暴露 Prometheus 格式并精简指标
原生 JSON 输出字段多、嵌套深,不适合直接喂给 Prometheus。开启原生 Prometheus endpoint 需两步:
在
http块中添加:vhost_traffic_status_format prometheus;
(仅此一行就注册/status/format/prometheus路径)-
显式定义 location 控制访问与范围:
location /status/format/prometheus { vhost_traffic_status_display; vhost_traffic_status_display_format prometheus; allow 127.0.0.1; allow 10.0.10.0/24; # Prometheus 所在网段 deny all; }
若只想保留核心指标(避免 upstream、cache 等干扰),可加:vhost_traffic_status_filter_by_host off;
这样指标名里就不会出现 upstream_ 或 cache_ 前缀,只留 nginx_vts_server_* 类。
验证是否生效的最快方式
直接请求 /status/format/json,检查返回体中的 serverZones 字段:
- 若看到
"www.example.com"、"client::www.example.com"、"route::www.example.com:/api/v1/login"等多个键,说明打标成功; - 每个键下的
requests、responses.2xx、in_bytes、response_time.avg就是你要的细粒度指标; - 刷新几次页面或发几笔测试请求,数值应实时变化。
不复杂但容易忽略。

















