limit_req_zone必须且只能定义在http块内,用于声明限流共享内存区域,本身不生效,需配合limit_req在server或location中调用;语法为$variable zone=name:size rate=rate,支持按IP、URI或组合键限速,zone名全局唯一,内存大小需合理预估。

直接在 http 块里写 limit_req_zone 就是定义全局限流的唯一方式。它不生效,只是“建桶”——真正起作用要靠后续 limit_req 在 server 或 location 中调用。
必须放在 http 块内,且只能放这里
该指令语法严格限定作用域:
- 只允许出现在
http { ... }大括号内部 - 不能写在
server、location、if或其他嵌套块中,否则 Nginx 启动报错:"limit_req_zone" directive is not allowed here - 多个
limit_req_zone可共存,用于不同维度(如 IP、URI、组合键)
关键参数怎么设才合理
一个典型配置长这样:
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=5r/s;
各部分含义:
-
$binary_remote_addr:推荐用这个变量做 key,IPv4 固定占 4 字节、IPv6 占 16 字节,比
$remote_addr更省内存、哈希更稳 -
zone=ip_limit:10m:名称
ip_limit必须全局唯一;大小10m要预估够用——1MB 约存 1.6 万个独立 key,高并发时内存不足会导致限流失效(日志里出现limiting requests却无拒绝) -
rate=5r/s:静态值,单位只能是
r/s或r/m,不支持变量(如rate=$my_rate是非法的)
常见全局限流场景写法
根据防护目标选 key 和参数:
-
按客户端 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 Nginx 后检查两件事:
- 看错误日志:
tail -f /var/log/nginx/error.log,若出现limiting requests或rejected字样,说明已触发 - 用压测工具验证:
ab -n 20 -c 10 http://your-domain/,观察是否出现 503 响应(默认拒绝行为) - 注意:仅定义
limit_req_zone不会拦截请求,必须搭配limit_req zone=xxx;才生效


















