nginx中limit_req_zone必须置于http块内,以$binary_remote_addr为key、zone名称唯一且内存大小合理(如10m)、rate设为静态值(如10r/s)来定义共享内存区域。

在 Nginx 中设置 limit_req_zone 共享内存区域来存储 IP 访问状态,核心是三步:选对变量、定好内存大小、设准速率,且必须放在 http 块内。
必须写在 http 块中
limit_req_zone 只能在 http { ... } 大括号内部声明,不能出现在 server、location 或 if 里,否则启动会报错:"limit_req_zone directive is not allowed here"。它只是“建桶”,不拦截请求,真正生效要靠后续的 limit_req 指令调用。
推荐用 $binary_remote_addr 作 key
这是最常用也最稳妥的方式:
-
$binary_remote_addr 是客户端 IP 的二进制表示,IPv4 固定占 4 字节,IPv6 占 16 字节,比字符串形式的
$remote_addr更省内存、哈希更稳定 - 避免用
$http_x_forwarded_for直接做 key(容易被伪造),如需支持代理环境,应配合set_real_ip_from和real_ip_header提前还原真实 IP,再用$binary_remote_addr
zone 名称和内存大小要合理
语法形如 zone=ip_limit:10m:
- 名称(如
ip_limit)必须全局唯一,不能重复 - 大小(如
10m)决定能存多少个独立 IP:经验上 1MB 约存 1.6 万个 IP,10MB 可支撑约 16 万 IP;高并发场景建议预留余量,Windows 环境建议 ≤3m - 内存不足时,Nginx 会自动淘汰 60 秒内未活跃的记录;若仍无法容纳新 IP,新请求可能被误放行或日志出现异常提示
rate 值只能是静态数字
例如 rate=5r/s 或 rate=30r/m:
- 单位只支持
r/s(每秒请求数)或r/m(每分钟请求数) - 不支持变量,像
rate=$my_rate是非法语法,会直接导致配置加载失败 - Nginx 内部以毫秒粒度追踪,
5r/s实际相当于每 200ms 一个令牌;没令牌时,请求按策略延迟或拒绝
典型配置示例:
http {<br> limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;<br>}











