直接编译安装是唯一可靠方式,Nginx 1.25+不支持vts模块,须降级至1.20.2或1.22.1;需匹配对应vts分支(如vts-1.22),configure时显式指定--add-module绝对路径,vhost_traffic_status_zone须置于http顶层并带shared前缀,/status路由必须精确配置且在server块内,启用filter_by_host才能显示域名,upstream需同名zone声明,禁用HTML格式以防卡顿。

直接编译安装是唯一可靠方式,用包管理器装的 Nginx 无法加 vts 模块;Nginx 1.25+ 版本已彻底不支持,必须降级到 1.20.2 或 1.22.1。
确认 Nginx 版本并匹配 vts 分支
运行 nginx -v 查版本,再立刻执行 nginx -V 看完整 configure 参数——这是你后续编译时必须复用的基础。vts 模块没有通用 master 分支:
- Nginx 1.20.x → 必须用 vts 的
vts-1.20分支(不是 master) - Nginx 1.22.x → 对应
vts-1.22分支 - Nginx 1.24+ → 即使强行编译也大概率崩溃,别试
克隆命令示例:git clone -b vts-1.22 https://github.com/vozlt/nginx-module-vts.git
编译时路径和参数不能出错
./configure 必须显式带 --add-module=/绝对路径/to/nginx-module-vts,路径里不能有软链接,否则报 no such file or directory。常见错误包括:
- 漏掉原有模块参数(比如
--with-http_ssl_module),导致 HTTPS 失效 - 误用
--add-dynamic-module后又没配load_module,结果模块根本没加载 - 把
vhost_traffic_status_zone;写在http块顶层,而不是server块内或upstream块里,导致所有流量归到 default
正确 zone 声明示例:vhost_traffic_status_zone shared:vts:10m;,注意 shared: 前缀和大小写
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
/status 路由返回 404 或空白页
这不是模块没生效,而是路由配置太敏感:
- location 必须写成
location /status { ... },不能是/status/、/status/index.html或带 rewrite - 必须放在某个
server块里,不能只丢在http块顶层 - vts 默认只响应 GET 请求,如果前端用 POST 调 JSON 接口会直接 405
- 验证是否跑起来:浏览器直接访问
/status/format/json,能返回 JSON 就说明模块和路由都对了
HTTPS 环境下还要检查是否有中间代理(如 WAF)拦截了 User-Agent: nginx-module-vts 这类内部请求头
数据看不到 server_name 或 upstream 名
vts 默认聚合到 IP+port,不会自动识别域名或 upstream 变量名:
- 要显示具体虚拟主机,必须开启
vhost_traffic_status_filter_by_host on;,且确保请求带Host头 - 要监控 upstream,必须在
upstream块里显式声明同名 zone:upstream api_backend { vhost_traffic_status_zone api_backend; } - 如果
proxy_pass http://$dynamic_upstream这种变量写法,vts 解析不出名字,所有数据进unknown - JSON 返回的
serverZones字段里,key 是 zone 名(如api_backend),不是server_name值,别对着域名找数据
HTML 页面在上百个 server 时必然卡死,生产环境务必禁用 vhost_traffic_status_display_format html;,只留 JSON 接口供 exporter 或前端轮询

















