limit_req_zone配置限流需明确“谁被限”(key,如$binary_remote_addr)、“限多快”(rate,如5r/s)、“存哪”(zone=name:size,如zone=api_limit:10m),基于漏桶算法实现。

直接用 limit_req_zone 配置限流,核心是把“谁被限”“限多快”“存哪”三件事说清楚。它背后就是漏桶算法:请求像水一样灌进桶,桶底以固定速率漏水(处理请求),桶满就溢出(拒绝请求)。
定义限流区域(必须在 http 块里)
这是所有限流的起点,告诉 Nginx “按什么维度统计、存多少、速率为多少”:
-
key:决定谁被统一计数。常用
$binary_remote_addr(客户端 IP 二进制格式,省内存),也可用$http_x_user_id(需前端传用户标识)、$server_name(按域名限) -
zone=name:size:分配共享内存区,如
zone=api_limit:10m表示起名api_limit,分配 10MB 内存存计数器(1MB ≈ 1.6 万个 IP 条目) -
rate=xxx:桶底漏水速度,单位支持
r/s(每秒)或r/m(每分钟),例如rate=5r/s或rate=300r/m
在 location 中启用限流规则
光定义 zone 不生效,得在具体路径上挂载规则:
-
limit_req zone=api_limit;:严格按 rate 执行,超速立刻 503 -
limit_req zone=api_limit burst=20;:允许最多 20 个请求排队等待,后续按 rate 逐个放行(有延迟感) -
limit_req zone=api_limit burst=20 nodelay;:burst 内请求全部立即放行,不排队;长期平均速率仍被 rate 控制
常见组合与效果差异
不同参数搭配直接影响用户体验和防护强度:
- 只写
limit_req zone=xxx;→ 纯匀速,适合对时延敏感的后台接口 -
burst=N→ 提供缓冲空间,抗短时流量尖峰,但用户会感知排队延迟 -
burst=N nodelay→ 瞬间消化突发,适合前端页面加载、登录等场景,注意别让 burst 过大失去限流意义 - 可叠加多个限流:比如同时按 IP 和用户 ID 限,各自独立生效
验证与调优小提示
配置完别急着上线,先测行为是否符合预期:
- 用
ab -c10 -n100 http://your-api/模拟并发,观察成功率和响应时间变化 - 查 Nginx 错误日志,503 出现频次能反映限流是否触发
- burst 值建议设为 rate 的 2–5 倍,例如 rate=10r/s 时 burst=20~50 较合理
- 内存 size 要够存下所有 key,IP 量大的服务建议 zone 至少 10m~20m


















