Nginx可通过limit_req模块限流、stub_status模块查看全局QPS、自定义日志配合脚本分析实现轻量级访问频次统计;三者分别适用于实时防护、总体监控和细粒度分析,但均不替代专业日志系统。

在 Nginx 中实现简单的访问频次统计,主要依靠内置模块 ngx_http_limit_req_module(限流)和 ngx_http_stub_status_module(状态监控),无需额外编译第三方模块。核心思路是:限制单位时间内的请求数,并通过状态接口或日志辅助观察频次趋势。
使用 limit_req 实现请求频次控制与统计基础
该模块本身不直接“统计”访问次数,但通过配置限流规则,可间接反映高频访问行为,并配合日志记录实现简易统计。
- 定义共享内存区域,用于存储每个 key(如 IP)的请求计数:
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s; - 在 server 或 location 块中启用限流,触发时返回 503 并记录到 error log:
limit_req zone=perip burst=20 nodelay; - 当请求被限流(excess > 0),Nginx 会在 error log 中写入类似:
*123456 limiting requests, excess: 5.892 by zone "perip"
这里的 excess 值可视为该请求超出速率的“积压量”,结合时间戳可反推短时频次。
启用 stub_status 获取实时连接与请求指标
该模块提供轻量级运行时状态页,适合快速查看当前总体请求频次(如每秒请求数 QPS)。
- 确认 Nginx 编译时已启用该模块(默认通常开启);
- 在 server 块中配置一个内部 location:
location /nginx-status {
stub_status on;
allow 127.0.0.1;
deny all;
} - 访问 http://your-domain/nginx-status 可见三行输出,例如:
Active connections: 12
server accepts handled requests
12345 12345 23456
Reading: 1 Writing: 3 Waiting: 8
其中第三行末尾的 requests 是自启动以来总请求数,配合时间差可估算平均 QPS。
结合日志格式记录客户端请求频率线索
通过自定义 log_format 记录时间戳、IP、URI 和请求处理时间,再用脚本(如 awk / Python)按时间窗口聚合分析,是最灵活的频次统计方式。
- 定义带毫秒精度的时间格式:
log_format freq '$time_iso8601 $remote_addr "$request" $status $request_time'; - 在 access_log 中使用该格式;
- 示例命令统计每分钟 IP 请求量(需日志滚动配合):
awk '{print substr($1,1,16)}' access.log | sort | uniq -c | sort -nr
输出形如 1234 2024-05-20T14:22,即该分钟内某 IP 的请求数。
注意点与适用边界
上述方法均为轻量级方案,适用于运维排查、粗粒度防护或监控看板,不替代专业日志分析系统(如 ELK)或实时流式统计(如 Prometheus + nginx-vts-exporter)。
- limit_req 统计基于内存共享区,重启后清零,且只对匹配的请求生效;
- stub_status 不区分 IP 或路径,仅反映全局吞吐;
- 日志分析依赖磁盘 I/O 和后处理能力,高频场景建议搭配 logrotate 控制体积。


















