Nginx用limit_req模块限流的核心是定义限速区域(limit_req_zone)并启用规则(limit_req),基于漏桶算法:rate设漏水速度,burst设桶容量,nodelay控制超量请求是否立即放行;需结合$binary_remote_addr等key、合理zone内存及实际场景配置。

用 limit_req 模块控制请求处理速率,核心是“定义限速区域 + 在具体位置启用限速”,本质基于漏桶算法:固定速率放行请求,超量请求可排队(burst)或立即拒绝(加 nodelay 后快速放行)。
定义限速区域(http 块中)
使用 limit_req_zone 指令声明一个共享内存区,决定“谁被限”“限多严”“存多久”:
-
key:常用
$binary_remote_addr(按客户端 IP 限流),比$remote_addr更省内存;也可用$http_x_forwarded_for(需确认可信代理)或$uri(按接口路径限) -
zone=name:size:例如
zone=api_limit:10m,表示起名api_limit、分配 10MB 共享内存存计数状态 -
rate:格式如
10r/s(每秒 10 个)或600r/m(每分钟 600 个),这是漏桶的“漏水速度”
在 location 或 server 中启用限速(应用规则)
用 limit_req 把前面定义的 zone 绑定到实际路径:
-
limit_req zone=api_limit;:严格按 rate 执行,超量直接 503 -
limit_req zone=api_limit burst=20;:允许最多 20 个请求进队列,但依然按 rate 速率慢慢放行(比如 rate=10r/s,burst=20,第 11–30 个请求会排队,第 31 个开始 503) -
limit_req zone=api_limit burst=20 nodelay;:队列中的请求不等“漏水”,立刻处理——适合应对短时突发,但后端要能扛住瞬时压力
常见组合与注意事项
实际配置中常搭配其他指令增强效果:
- 和
limit_conn配合:先控并发连接数(防夯死),再控请求速率(防刷接口),二者作用层面不同 - 避免误伤:若服务走 CDN 或反向代理,
$binary_remote_addr可能全是代理 IP,此时应改用可信头如$http_x_real_ip,并确保 proxy_set_header 正确传递 - 内存大小要合理:zone 太小会导致频繁淘汰状态,影响限流准确性;10MB 通常够数千 IP 同时计数
- 测试验证:可用
ab -c 50 -n 100 http://your-site/观察 503 比例,配合nginx -t && nginx -s reload热更新配置


















