Nginx 不直接暴露限流区域内存使用量,需通过 nginx-module-vts 暴露状态页并解析 JSON 中 used_size 字段,再经 nginx-vts-exporter 转为 Prometheus 指标如 nginx_vts_limit_req_used_bytes。

Nginx 本身不直接暴露“限流区域(limit_req zone)的当前占用内存大小”这一指标,Prometheus 也无法原生采集该值。但可通过组合手段间接获取——核心思路是:利用 Nginx 的 stub_status 模块或第三方模块(如 nginx-module-vts)暴露状态页 → 解析 HTML/JSON 中的 zone 使用统计 → 用 exporter 转为 Prometheus 可抓取的指标。
以下是实用可行的路径:
✅ 确认 Nginx 是否启用 limit_req 并配置了命名 zone
确保你的 nginx.conf 中有类似配置:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
server {
location /api/ {
limit_req zone=perip burst=10 nodelay;
...
}
}其中 zone=perip:10m 表示名为 perip、最大内存为 10MB 的限流区域。
✅ 启用并暴露 Nginx 状态接口(推荐使用 nginx-module-vts)
官方 stub_status 不提供 zone 内存使用详情;而 nginx-module-vts(VTS = Virtual Host Traffic Status)可输出各 limit_req_zone 的实时条目数、共享内存使用量等关键数据(含 max_size 和 used_size)。
- 编译时加入该模块(或使用预编译支持 VTS 的镜像,如
nginx:alpine-vts) - 在
http块中添加:vhost_traffic_status_zone; vhost_traffic_status_filter_by_host on;
- 添加状态页面 location:
location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html; # 或 json }
访问 http://your-nginx/status/format/json,响应中会包含类似字段:
"limit_req": {
"perip": {
"max_size": 10485760,
"used_size": 234560,
"entries": 182
}
}→ used_size 即当前 zone 占用的共享内存字节数(关键指标)。
✅ 部署 exporter 将 VTS JSON 转为 Prometheus 指标
可用轻量级工具如 nginx-vts-exporter(Go 编写,单二进制):
- 启动命令示例:
./nginx-vts-exporter -nginx.scrape_uri http://localhost/status/format/json
- 默认监听
:9913,Prometheus 抓取http://exporter:9913/metrics,自动暴露:nginx_vts_limit_req_used_bytes{zone="perip"} 234560 nginx_vts_limit_req_max_bytes{zone="perip"} 10485760 nginx_vts_limit_req_entries{zone="perip"} 182
✅ 提示:若无法安装第三方模块,可临时用
curl + awk/sed解析/status/format/json并通过textfile_collector注入 Prometheus,但稳定性与实时性较差,不推荐生产环境长期使用。
✅ 在 Prometheus 中查询与告警示例
- 查询当前 perip zone 内存使用率:
nginx_vts_limit_req_used_bytes{zone="perip"} / nginx_vts_limit_req_max_bytes{zone="perip"} - 设置告警(如 > 85%):
- alert: NginxLimitReqMemoryHigh expr: nginx_vts_limit_req_used_bytes{zone=~".+"} / nginx_vts_limit_req_max_bytes{zone=~".+"} > 0.85 for: 2m labels: severity: warning annotations: summary: "Nginx limit_req zone {{ $labels.zone }} memory usage high"
不复杂但容易忽略。


















