limit_req_zone 是 Nginx 限流的核心指令,仅用于 http 块内声明共享内存区域,定义统计维度(如 $binary_remote_addr)、zone 名称大小及固定速率,必须配合 limit_req 才生效。

limit_req_zone 是 Nginx 实现请求速率限制的核心指令,它本身不拦截请求,只负责“建桶”——即在共享内存中为限流状态分配空间、定义统计维度和速率规则。真正起作用的限流行为,必须由后续的 limit_req 指令在 server 或 location 块中调用该 zone 才能触发。
必须且只能放在 http 块内
该指令的作用域被严格限定:只允许出现在 http { } 大括号内部。写在 server、location、if 甚至 events 块中都会导致 Nginx 启动失败,并报错:
这是硬性语法约束,不是风格建议。多个 limit_req_zone 可共存于同一 http 块,用于不同维度的限流(如 IP、URI、组合键),但 zone 名称必须全局唯一。
核心参数含义与合理设置
标准语法为:limit_req_zone $variable zone=name:size rate=rate;
-
$variable(key):决定按什么维度聚合请求。推荐用
$binary_remote_addr(IPv4 固定 4 字节,IPv6 固定 16 字节),比$remote_addr更省内存、哈希更稳定;也可用$request_uri保护特定接口,或拼接如$binary_remote_addr$request_uri实现精细控制 - zone=name:size:name 是区域标识符,必须唯一;size 是共享内存大小。经验上 1MB 约可存储 1.6 万个独立 key,高并发场景需预留余量(例如 10m 支撑约 16 万 IP)。Windows 环境建议 ≤3m
-
rate=rate:仅支持静态值,单位为
r/s或r/m(如5r/s或300r/m)。不支持变量(rate=$my_rate是非法的)
典型全局限流配置示例
以下均需置于 http 块内:
- 按客户端 IP 限速(防暴力刷):
limit_req_zone $binary_remote_addr zone=perip:2m rate=10r/s; - 按接口路径限速(保 API 稳定):
limit_req_zone $request_uri zone=byuri:3m rate=3r/s; - IP + 路径组合(精细但内存翻倍):
limit_req_zone $binary_remote_addr$request_uri zone=ipuri:4m rate=1r/s;
注意:这些语句只是声明,不生效。reload 后可通过错误日志(limiting requests)、压测工具(观察是否返回 503)验证是否实际触发。
常见误区与关键提醒
- 仅定义 limit_req_zone 不会拒绝任何请求,必须配合 limit_req 使用
- 内存不足时,限流可能静默失效:日志出现
limiting requests, excess却无拒绝响应 - rate 值基于漏桶算法平滑执行,不是简单计数器;突发流量靠 limit_req 的
burst和nodelay控制 - 不建议用 $remote_addr 作 key —— 字符串长度不固定,易造成内存浪费与哈希冲突


















