要让prometheus实时抓取nginx缓存命中率指标,必须使用nginx-module-vts模块替代原生stub_status,因其提供/status/format/prometheus端点及nginx_vts_cache_hits_total等关键指标;配置nginx启用vts并开放该路径,prometheus通过job抓取后,用rate()函数计算5分钟滚动命中率,并结合cache标签与关联指标定位问题。

要让Prometheus实时抓取Nginx缓存命中率指标,关键在于Nginx必须暴露带缓存维度的原始数据——而原生stub_status模块不支持缓存相关指标,必须使用nginx-module-vts(Virtual Host Traffic Status)模块。
确认Nginx已启用vts模块并开放Prometheus接口
vts模块编译进Nginx后,会自动提供/status/format/prometheus端点,其中包含缓存类核心指标。需确保:
- Nginx配置中已启用vts,并至少有一个
server或upstream块被vts统计(默认开启) - HTTP server块内有类似如下location配置(无需额外鉴权,但建议限制访问IP):
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format prometheus;
allow 127.0.0.1;
deny all;
} - 重启Nginx后,用
curl http://127.0.0.1/status/format/prometheus能返回大量以nginx_vts_开头的指标,包括nginx_vts_cache_hits_total和nginx_vts_cache_misses_total
在Prometheus中配置抓取任务
编辑prometheus.yml,添加静态或服务发现目标,指向Nginx的vts Prometheus接口:
- 示例静态配置:
- job_name: 'nginx-vts'
static_configs:
- targets: ['192.168.1.100:80']
metrics_path: /status/format/prometheus - 若Nginx部署在K8s中(如ingress-nginx),可用ServiceMonitor或PodMonitor自动发现,路径仍为
/status/format/prometheus - 抓取成功后,在Prometheus UI的
Targets页应显示该job为UP状态
计算缓存命中率的PromQL表达式
命中率不是直接采集的指标,而是通过两个计数器实时计算得出。推荐使用以下稳定表达式(避免除零、处理瞬时重置):
-
5分钟滚动命中率(推荐):
rate(nginx_vts_cache_hits_total[5m]) / (rate(nginx_vts_cache_hits_total[5m]) + rate(nginx_vts_cache_misses_total[5m])) -
区分缓存层级(如proxy vs upstream):vts指标自带
cache标签,例如nginx_vts_cache_hits_total{cache="proxy"}可单独计算反向代理层命中率 - 注意:若返回
NaN,说明某一方在5分钟内无新计数,可加or vector(0)兜底,或改用increase()配合offset应对计数器重置
关联分析提升问题定位能力
单看命中率数字意义有限,需结合其他vts指标交叉判断:
- 命中率下降 +
nginx_vts_cache_misses_total突增 → 检查proxy_cache_valid配置或后端响应头Cache-Control是否被覆盖 - 命中率正常但
nginx_vts_upstream_response_time_seconds_sum升高 → 缓存虽生效,但后端响应变慢拖累整体延迟 - 命中率骤降为0且
nginx_vts_cache_size_bytes持续归零 → 可能proxy_cache_path磁盘满或权限异常











