如何用Prometheus监控自建CDN?Nginx VTS Exporter配置详解

来源:Android教程作者:北京网站建设头衔:草根站长
导读:本期聚焦于北京网站建设创作的《如何用Prometheus监控自建CDN?Nginx VTS Exporter配置详解》,敬请观看详情。自建CDN节点分散在多地机房,流量、带宽和状态码的实时监控一直是运维环节中的难点。本文介绍如何通过Nginx的ngx_http_vts_module模块采集监控数据,再借助nginx-vts-exporter将数据转换为Prometheus可识别的指标格式,最终配合Grafana搭建可视化面板。内容涵盖模块编译安装、nginx.conf关键配置、exporter部署、Prometheus抓取任务定义,以及常用监控指标的含义与告警规则示例,帮助读者快速掌握自建CDN节点的监控方案。

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

如何用Prometheus监控自建CDN?Nginx VTS Exporter配置详解

一、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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。