limit_req_zone指令用于在Nginx的http块中定义限流共享内存区域,需配合limit_req使用;语法为$variable zone=name:size rate=rate,支持按IP、URI或组合限速,仅允许出现在http块且zone名须唯一。

在 Nginx 的 http 块中,limit_req_zone 指令用于定义请求频率限制的共享内存区域,是实现限流(rate limiting)的基础配置。它本身不启用限流,只声明“在哪里存、按什么键算、速率多少”,真正生效需配合 limit_req 指令在 server 或 location 块中调用。
语法与核心参数说明
limit_req_zone $variable zone=name:size rate=rate;
-
$variable:用于生成限流键(key)的变量,常见如
$binary_remote_addr(客户端 IP 二进制形式,更省内存)、$request_uri、$host或组合如$binary_remote_addr$request_uri -
zone=name:size:定义共享内存区域名称和大小,例如
zone=perip:10m表示名为perip、分配 10MB 内存的区域。内存大小需根据并发请求数和 key 数量合理预估,不足会导致限流失效(Nginx 日志中出现limiting requests, excess但未拒绝) -
rate=rate:指定最大平均请求速率,单位支持
r/s(每秒请求数)或r/m(每分钟),如rate=5r/s表示每秒最多允许 5 个请求(基于漏桶算法平滑处理)
常用限流场景配置示例
以下为典型实践,均放在 http 块内:
- 按 IP 限速(防暴力请求):
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s; - 按接口路径限速(保护高频 API):
limit_req_zone $request_uri zone=uri_limit:10m rate=5r/s; - 按 IP + 路径组合限速(更精细控制):
limit_req_zone $binary_remote_addr$request_uri zone=ip_uri_limit:20m rate=2r/s;
注意事项与常见误区
配置时需注意几个关键点:
-
$binary_remote_addr比$remote_addr更推荐——前者长度固定(4 字节 IPv4 / 16 字节 IPv6),节省内存且哈希更稳定;后者含字符串开销,易导致内存浪费或冲突 - 共享内存区域(
zone)必须全局唯一,重复定义会引发 Nginx 启动失败 - 该指令仅支持出现在
http块,不能写在server或location中;否则报错"limit_req_zone" directive is not allowed here - 速率值不支持动态变量(如不能写
rate=$limit_rate),必须为静态数值
如何验证是否生效
配置后 reload Nginx,可通过以下方式确认:
- 检查错误日志:
tail -f /var/log/nginx/error.log,若看到limiting requests或rejected字样,说明限流已触发 - 用
ab或wrk工具压测,观察 HTTP 状态码是否出现503 Service Temporarily Unavailable(默认行为) - 使用
nginx -T查看完整展开配置,确认limit_req_zone出现在http块且无语法错误

















