Nginx stub_status不显示限流丢弃数,因其仅统计全局连接与请求(Accepts/Handled/Requests),不记录limit_req触发的503响应;需通过log_format配合$limit_status变量记录并解析日志,或结合Prometheus、Loki等工具实现实时监控。

Nginx 本身不提供“限流丢弃请求数”的实时页面展示,stub_status 模块只返回全局连接与请求统计(如 Accepts/Handled/Requests),不包含被 limit_req 拒绝的请求数。要实时观察当前丢弃的限流请求数,需结合日志解析与外部工具,而非单纯依赖一个监控页面。
stub_status 页面无法看到限流丢弃数的原因
/nginx-status 返回的内容形如:
Active connections: 15 server accepts handled requests 123456 123456 654321 Reading: 2 Writing: 3 Waiting: 10
-
accepts:Nginx 接收的 TCP 连接总数 -
handled:成功处理的连接数(≈ accepts,若不等说明有连接被丢弃,但非限流导致) -
requests:HTTP 请求总数(含所有成功/失败请求,但不区分是否被 limit_req 拒绝)
→ 它完全不记录503 Service Temporarily Unavailable这类由limit_req触发的响应。
正确获取当前丢弃请求数的实用方式
-
启用并解析 access_log 中的限流标记
Nginx 默认不会在日志中明确标记被限流的请求。需主动添加日志变量:log_format limitlog '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' 'rt=$request_time uct="$upstream_connect_time" ' 'uht="$upstream_header_time" urt="$upstream_response_time" ' 'limit_status=$limit_status'; // 关键:记录限流状态在
location或server块中启用该格式,并确保limit_req已配置:location /api/ { limit_req zone=perip burst=10 nodelay; access_log /var/log/nginx/api_limit.log limitlog; }→ 被限流的请求会在日志中显示
limit_status=limit(或limit=1),而正常请求为-或空。
实时统计丢弃数(每秒):tail -f /var/log/nginx/api_limit.log | grep '"limit_status=limit"' | awk '{print strftime("%H:%M:%S")}' | uniq -c -
用 Prometheus + nginx-exporter + 自定义指标
标准nginx-exporter不采集限流拒绝数,但可通过以下方式补全:- 修改 Nginx 配置,在
limit_req后加一个error_page 503,将限流响应重写为特殊路径(如/__limit_rejected),再用access_log单独记录该路径; - 或使用 OpenResty + Lua,在
access_by_lua_block中计数并上报到/metrics接口(需自建 exporter)。
- 修改 Nginx 配置,在
-
临时调试:开启 error_log 的 debug 级别(仅测试环境)
error_log /var/log/nginx/error.log debug;
当
limit_req拒绝请求时,会输出类似:*123456 limiting requests, excess: 1.000 by zone "perip", client: 192.168.1.100, ...
可用
grep "limiting requests" /var/log/nginx/error.log | tail -20快速确认近期丢弃情况。
小结:没有“开箱即用”的丢弃数页面,但可快速落地
- 生产环境推荐:
log_format + $limit_status + 日志实时聚合(如 Filebeat + Grafana Loki); - 运维巡检可用:
awk '/limit_status=limit/ {c++} END{print c+0}' /var/log/nginx/access.log统计历史总量; - 若必须网页化,可写一个轻量脚本(Python/Shell),定时解析日志、写入 Redis 或本地文件,再用简单 HTML + AJAX 展示最新数值。
Nginx 的设计哲学是“控制优先、可观测其次”,限流丢弃数属于精细化运营指标,需主动埋点,不是默认暴露项。


















