limit_req的burst参数基于令牌桶模型缓冲突发请求,burst设桶容量,配合nodelay可瞬时放行(削峰不阻塞),不配则排队匀速释放;调优需据峰值设burst值并监控rejected/delayed次数。

使用 limit_req 的 burst 参数,本质是借助“令牌桶”模型为突发请求提供缓冲空间,而非简单丢弃——关键在于合理设置 burst 值并配合 nodelay(或不配)来控制排队行为。
burst 的作用机制
burst 定义了令牌桶中允许暂存的额外请求数(即“桶容量”)。当请求速率超过 rate 设定值时,超出部分不会立刻被拒,而是先填入桶中等待;只要桶未满,请求就被接受(进入排队或立即执行)。
- 桶中令牌按
rate规则匀速补充(例如rate=1r/s→ 每秒补 1 个) -
burst=5表示最多可缓存 5 个“迟到”的请求 - 若连续 6 个请求瞬间到达,前 5 个进桶,第 6 个才被拒绝(除非启用
nodelay)
搭配 nodelay 实现“削峰不阻塞”
默认情况下,超出 rate 的请求会排队,Nginx 尝试按节奏释放(可能引入延迟)。加 nodelay 后,只要桶中有空间,突发请求就立即通过,不排队、不延时——真正实现平滑承接。
示例配置:
limit_req_zone $binary_remote_addr zone=bursty:10m rate=5r/s;
server {
location /api/ {
limit_req zone=bursty burst=20 nodelay;
proxy_pass http://backend;
}
}
- 基础限速:5 请求/秒
- 桶容量:20,允许最多突发 20 个请求“瞬时通过”
-
nodelay确保这 20 个不排队,后端几乎同时收到(压力需后端能承受)
不加 nodelay:用排队换稳定性
去掉 nodelay,突发请求会按桶补充节奏依次放出。适合后端较脆弱、需严格控压的场景。
- 仍设
burst=20,但无nodelay - 瞬间来 25 个请求:前 5 个立即处理,中间 20 个进队列,以 200ms 间隔(因 5r/s ≈ 每 200ms 放 1 个)陆续转发
- 客户端感知为轻微延迟,而非大量 503
实际调优建议
-
burst值参考历史最大秒级峰值 × 1.2~1.5,避免设过大导致后端雪崩 - 监控
limit_req_status变量(如记录到日志),观察rejected和delayed次数,动态调整burst - 高并发 API 可分层限流:外层用大
burst + nodelay挡毛刺,内层用小rate防长时过载 - 注意
limit_req_zone内存占用,$binary_remote_addr比$remote_addr更省空间


















