使用 limit_req_zone 限制请求频率需先在 http 块定义共享内存区域,再在 location 或 server 块中用 limit_req 启用;常用参数包括 $binary_remote_addr、zone=name:size 和 rate=rate;burst 控制突发容量,nodelay 决定是否延迟处理;可自定义状态码(如429)和日志记录。

使用 limit_req_zone 限制请求处理频率,核心是先定义一个共享内存区域来存储客户端请求状态,再在 server 或 location 块中用 limit_req 指令启用该限流规则。
定义限流区域(limit_req_zone)
在 http 块中配置,语法为:
常用参数说明:
-
$variable:通常用
$binary_remote_addr(客户端 IP 的二进制形式),节省内存;也可用$cookie_user、$request_uri等做更细粒度控制 -
zone=name:size:定义共享内存区域名称和大小,如
zone=ip_limit:10m表示名为ip_limit、容量 10MB 的区域 -
rate=rate:限流速率,单位是
r/s(每秒请求数)或r/m(每分钟),例如rate=5r/s
在 location 中启用限流(limit_req)
在需要限流的 location 或 server 块中添加:
关键选项解释:
-
zone=name:必须与
limit_req_zone中定义的name一致 -
burst=number:允许突发请求数(令牌桶的“桶容量”)。超出
rate但未超burst的请求会被延迟处理(排队) -
nodelay:不延迟突发请求,直接按
rate丢弃超出部分(配合burst使用时,只放行前burst个,其余 503)
例如:limit_req zone=ip_limit burst=10 nodelay; 表示允许最多 10 个瞬时请求,超过即返回 503。
可选:自定义限流响应与日志
限流触发时默认返回 503,可通过以下方式调整:
- 用
limit_req_status 429;改为返回 429 Too Many Requests - 搭配
error_page 429 = @ratelimit;自定义响应体或跳转 - 通过
log_format和$limit变量记录是否被限流(需开启limit_req_log_level)
常见组合示例
限制单 IP 每秒最多 3 个请求,允许最多 5 个请求排队,超限立即拒绝:
http {limit_req_zone $binary_remote_addr zone=perip:10m rate=3r/s;
server {
location /api/ {
limit_req zone=perip burst=5 nodelay;
limit_req_status 429;
}
}
}
注意:burst 值不宜过大,否则失去限流意义;zone 内存大小要足够容纳预期并发 IP 数(1MB 约支持 1.6 万个 IP)。











