自建CDN的节点往往部署在多个机房,每个节点上都运行着Nginx作为边缘缓存服务器。一旦某个节点出现带宽跑满、回源异常或者5xx错误突增的情况,如果没有一套完善的监控体系,运维人员很难在第一时间发现问题。Prometheus配合Nginx VTS Exporter是目前监控自建Nginx集群最主流的方案之一,它能够以极低的开销采集到每个server、每个upstream甚至每个缓存区域的详细指标。本文将从模块安装、配置、指标采集到可视化展示,完整讲解这套监控体系的搭建过程。

一、Nginx VTS模块的原理与安装
Nginx本身并不提供足够细粒度的状态统计能力,原生的ngx_http_stub_status_module只能给出活跃连接数、总请求数等少量指标,无法区分不同虚拟主机和上游服务的数据。而由vozlt开发的ngx_http_vts_module(Nginx virtual host traffic status)通过共享内存记录每个server块、upstream块以及缓存区域的实时状态,包括请求量、响应时间、流量、状态码分布等几十项指标,并对外暴露一个JSON格式的状态页面。
如果Nginx是通过源码编译安装的,可以直接重新编译并追加该模块:
# 下载并解压模块源码 cd /usr/local/src git clone https://github.com/vozlt/nginx-module-vts.git # 查看当前Nginx的编译参数 nginx -V # 进入Nginx源码目录,追加模块重新编译 cd /usr/local/src/nginx-1.24.0 ./configure --prefix=/usr/local/nginx \ --add-module=/usr/local/src/nginx-module-vts \ --with-http_ssl_module make # 备份旧二进制后替换(不要执行make install覆盖配置) cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak cp objs/nginx /usr/local/nginx/sbin/nginx
编译完成后,通过nginx -V确认输出参数中已包含vts模块,再执行nginx -t验证配置语法无误即可平滑重载。需要注意,动态模块方式(--add-dynamic-module)编译时,还需要在nginx.conf中用load_module指令加载对应的.so文件。
二、nginx.conf中的VTS关键配置
模块安装好之后,需要在nginx.conf中开启状态统计。核心指令是vhost_traffic_status_zone,它会分配一块共享内存用于存放统计数据。下面是一个针对CDN边缘节点的典型配置:
http {
vhost_traffic_status_zone;
# 可选:按节点维度打标签,便于在Prometheus中区分不同CDN节点
vhost_traffic_status_filter_by_host on;
# 建议为状态页面单独设置访问控制
server {
listen 8080;
server_name localhost;
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
allow 10.0.0.0/8;
deny all;
}
# JSON格式的接口,exporter从这个地址抓取数据
location /status/format/json {
vhost_traffic_status_display;
vhost_traffic_status_display_format json;
allow 10.0.0.0/8;
deny all;
}
}
}vhost_traffic_status_zone默认分配1M共享内存,对于server块数量较多的CDN节点,建议显式指定更大的空间,例如vhost_traffic_status_zone shared:vhost_traffic_status:16m,否则统计条目过多时会触发溢出丢弃。此外,如果某些虚拟主机不希望被统计(比如健康检查接口对应的server),可以在对应server块内使用vhost_traffic_status off;来关闭采集。
对于CDN场景,缓存命中率是核心指标。若使用了proxy_cache,模块还能通过vhost_traffic_status_set_by_filter指令把缓存状态(HIT、MISS、EXPIRED等)记录为过滤指标,从而在Grafana中绘制出命中率曲线,这对评估回源压力非常有价值。
三、部署nginx-vts-exporter并接入Prometheus
vts模块暴露的是JSON数据,而Prometheus只认Pull模式下的文本格式指标,因此需要一个转换层,这就是nginx-vts-exporter的作用。它定时抓取Nginx的JSON状态接口,转换为标准的Prometheus指标后暴露在/metrics路径上。
# 下载并解压exporter(以linux-amd64为例) wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.8/nginx-vts-exporter_v0.10.8_linux_amd64.tar.gz tar -zxvf nginx-vts-exporter_v0.10.8_linux_amd64.tar.gz mv nginx-vts-exporter /usr/local/bin/ # 指定状态页地址并启动,默认监听9913端口 export NGINX_STATUS=http://127.0.0.1:8080/status/format/json nohup nginx-vts-exporter &
生产环境建议用systemd管理exporter进程,避免意外退出后监控中断。接入Prometheus只需在prometheus.yml中增加抓取任务:
scrape_configs:
- job_name: 'nginx-vts'
static_configs:
- targets:
- '10.0.1.11:9913'
- '10.0.1.12:9913'
- '10.0.2.21:9913'
labels:
service: cdn-edge配置生效后,在Prometheus的Targets页面确认节点状态为UP,随后即可查询指标。常用的指标包括:nginx_server_requests(各状态码的请求数)、nginx_server_bytes(入出口流量)、nginx_server_responseMsec(平均响应时间)以及nginx_server_requestMsec(请求处理耗时)。利用rate()函数对这些计数器指标求导,就能得到每秒请求量QPS和带宽曲线。
最后补一条实用的告警规则示例:当某个节点5xx比例超过阈值时触发告警,表达式可以写成rate(nginx_server_requests{status="5xx"}[5m]) / rate(nginx_server_requests[5m]) > 0.01,持续3分钟后发出通知。配合Grafana导入官方的Nginx VTS仪表盘(ID为2948),再按节点和域名维度调整变量,一套完整的自建CDN监控体系就搭建完成了。
PrometheusNginx VTS ExporterCDN监控修改时间:2026-09-01 09:50:59