limit_req_zone在http块中定义共享内存区域用于限流统计,仅声明“建桶”不生效,必须配合location/server中的limit_req使用;参数包括$key(如$binary_remote_addr)、zone=name:size(名称唯一、大小合理)、rate=rate(静态值,单位r/s或r/m),禁用server/location内定义。

在 Nginx 的 http 块中配置 limit_req_zone,本质是定义一个共享内存区域(zone),用于存储按指定键(key)统计的请求频次数据。它本身不生效,只是“建桶”,后续需在 server 或 location 中用 limit_req “取桶使用”。
✅ 正确写法:必须放在 http { ... } 大括号内
http {
# 定义一个名为 perip、大小 2MB、按客户端 IP 限速 5r/s 的桶
limit_req_zone $binary_remote_addr zone=perip:2m rate=5r/s;
# 定义一个按接口路径限速的桶(适合保护 API)
limit_req_zone $request_uri zone=byuri:3m rate=2r/s;
# 组合键示例:IP + 路径(更精细,但内存占用更高)
limit_req_zone $binary_remote_addr$request_uri zone=ipuri:4m rate=1r/s;
server {
listen 80;
location /api/ {
limit_req zone=byuri burst=3;
}
}
}
⚠️ 注意:
limit_req_zone不能出现在server、location或if块中,否则启动会报错:"limit_req_zone" directive is not allowed here
? 关键参数说明
$variable(键)
推荐用$binary_remote_addr(IPv4 固定 4 字节,IPv6 固定 16 字节),比$remote_addr更省内存、哈希更稳;
若需按接口限速,用$request_uri;组合时可拼接,如$binary_remote_addr$request_uri。zone=name:size(内存区域)name必须全局唯一;size要合理——Linux 下常用10m,但 phpEnv 等 Windows 环境建议 ≤3m(实测2m–3m最稳定);
内存不足会导致限流静默失效(日志里出现limiting requests, excess却无拒绝)。rate=xxr/s或xxr/m(速率)
只支持静态值,不能用变量(如rate=$my_rate是非法的);
单位r/s表示每秒请求数,基于漏桶算法平滑控制。
? 常见错误避坑
- ❌ 把
limit_req_zone写进location或server块 → 启动失败 - ❌
zone名重复(如两个zone=perip:10m)→ Nginx 拒绝加载配置 - ❌ 在 Windows(如 phpEnv)中设
zone=perip:10m→ 极可能启动卡死或静默失败 - ❌ 用
$remote_addr代替$binary_remote_addr→ 内存浪费,IPv6 下易冲突
✅ 验证是否定义成功
- 执行
nginx -t检查语法; -
nginx -s reload重载; - 查看错误日志:
tail -f /var/log/nginx/error.log,正常无报错即表示 zone 已注册; - 压测时若看到
limiting requests或rejected日志,说明后续limit_req已触发限流。










