ngx_http_reqstat_module 是Nginx第三方统计模块,支持按 $server_name 实时统计各域名的QPS、响应时间、状态码、带宽等指标;需手动编译安装,配置 reqstat $server_name 和 /reqstat 接口,并注意共享内存大小与key规范化。

ngx_http_reqstat_module 是 Nginx 社区常用的一个第三方统计模块,它不依赖外部服务,直接在 Nginx 进程内完成请求级指标聚合,支持按 server_name(即域名)维度实时统计 QPS、响应时间、状态码分布、带宽等关键指标。要实现按域名的实时流量分析,核心在于正确配置 reqstat 指令、定义统计键(key),并配合内置的 /reqstat 接口或自定义 upstream 做数据导出。
一、编译安装与基础配置
该模块未内置在官方 Nginx 中,需手动编译集成:
- 下载模块源码(如从 https://github.com/vozlt/nginx-module-vts 或独立 reqstat 仓库获取);
- 重新编译 Nginx,添加
--add-module=/path/to/ngx_http_reqstat_module; - 确认加载成功:启动后执行
nginx -V 2>&1 | grep -o reqstat应有输出。
二、按域名(server_name)定义统计 key
reqstat 的核心是通过 reqstat 指令指定统计维度,其中 $server_name 是最直接的域名标识变量:
http {
reqstat zone=reqstat:10M; # 定义共享内存区,10MB 可支撑约数千个域名
<pre class="brush:php;toolbar:false;">server {
server_name api.example.com;
location / {
reqstat $server_name; # 关键:以域名作为统计 key
proxy_pass http://backend;
}
}
server {
server_name www.example.com;
location / {
reqstat $server_name;
proxy_pass http://web_backend;
}
}}
注意:$server_name 在多域名 server 块中会自动取匹配到的 server_name 值;若使用 server_name _; 或泛域名(如 *.example.com),建议改用 $host 并配合 map 做归一化处理,避免统计 key 过散。
三、启用实时指标接口与数据获取
模块默认提供 /reqstat 接口返回 JSON 格式聚合数据,可直接访问或由 Prometheus 抓取:
- 在任意 server 块中添加:
location /reqstat { reqstat_display; }; - 请求
curl http://api.example.com/reqstat将返回类似:
{
"api.example.com": {
"request": 12485,
"in_bytes": 3928471,
"out_bytes": 18472931,
"1xx": 0, "2xx": 11203, "3xx": 42, "4xx": 987, "5xx": 253,
"rt": 0.042, "rps": 12.8,
"upstream_rt": 0.039, "upstream_rps": 12.7
},
"www.example.com": { ... }
}字段说明:rps 是最近秒级 QPS,rt 是平均响应时间(秒),out_bytes 是下行流量字节数,可用于计算带宽(除以采样周期)。
四、进阶:聚合多域名 + 告警与可视化
单纯看 /reqstat 接口适合调试,生产中建议结合以下方式落地:
- 定时拉取 + 存储:用 cron 每 10 秒调用 /reqstat,解析 JSON 后写入时序数据库(如 InfluxDB、Prometheus);
-
按业务分组统计:用
map指令将多个子域名映射到统一业务名,再传给 reqstat,避免 key 爆炸; - 异常检测:监控单域名 5xx 突增、RT 超阈值(如 >1s)、RPS 归零等,触发企业微信/钉钉告警;
- 前端可视化:用 Grafana 连接 Prometheus 数据源,构建「各域名 QPS/RT/错误率」实时看板。
不复杂但容易忽略的是共享内存大小(zone)和 key 命名规范——域名含端口或大小写不一致会导致重复 key,建议统一小写、剥离端口,并预留足够 zone 内存防止溢出丢数。

















