nginx通过limit_req模块的burst与delay/nodelay协同实现“带缓冲区的漏桶”:burst设队列容量(如rate=10r/s+burst=20),delay对前n个超限请求动态延迟放行并返回x-ratelimit-delay头,nodelay则让缓冲请求即来即转;需搭配limit_conn防连接耗尽,并依后端p95耗时反推rate。

Nginx 对大流量突发请求的缓冲与排队,核心依赖 limit_req 模块中 burst 与 delay(或 nodelay)的协同机制,本质是实现“带缓冲区的漏桶”——既不简单丢弃,也不无限制堆积,而是在可控延迟下柔性消化脉冲。
burst:设置缓冲队列容量
burst 定义了超出基础速率后,允许暂存等待处理的最大请求数。它不是并发数,而是队列长度上限。
- 例如
rate=10r/s+burst=20:每秒最多放行 10 个请求;当瞬间来 30 个,前 20 个可入队缓存,第 21 个起被拒绝(默认 503) - 队列遵循 FIFO(先进先出),请求按进入顺序排队,等待以漏桶速率匀速放出
- burst 值需结合业务容忍延迟反推:若用户接受最长排队 2 秒,rate=10r/s,则 burst ≤ 20 较合理
delay:启用匀速延迟放行(平滑突刺)
delay 参数让 burst 队列中的部分请求不立即拒绝,而是动态计算等待时间后延迟执行,避免响应突变为 503。
-
delay=5表示最多对队列中前 5 个超限请求做延迟处理,其余仍直接 503 - 延迟时间由当前队列长度和 rate 共同决定,Nginx 自动注入
X-RateLimit-Delay响应头(需开启日志变量确认) - 注意:
delay不是毫秒值,且仅在burst > 0时生效;单独写delay无效
nodelay:释放队列压力,降低感知延迟
当 burst 队列已满、但后端实际处理较快时,nodelay 可跳过排队等待,让请求立刻交由 worker 处理(前提是未超 burst 总量)。
-
burst=20 nodelay:20 个缓冲请求全部“即来即转”,不额外加延时,适合后端响应快、CPU 富余场景 - 它不改变限流逻辑,只是优化调度策略——把排队交给后端应用层,而非 Nginx 内部队列
- 搭配
limit_conn使用更稳妥:防止单 IP 占满连接池拖垮整条流水线
配套架构建议:防堆积、控资源、可观测
纯靠 burst 和 delay 无法解决慢请求阻塞问题。生产环境需叠加防护:
- 用
limit_conn_zone+limit_conn限制单 IP 并发连接数,避免一个慢请求卡住整个队列 - 在
log_format中加入$limit、$limit_rate、$request_time,实时观测哪些请求被缓、被延、被拒 - rate 值建议从后端平均响应时间反推:如接口 P95 耗时 150ms,rate 可设为
6r/s~7r/s,留出缓冲余量











