nginx的burst是为突发流量提供临时排队空间而非放行超速请求;其合理值取决于后端平均响应时间和最大容忍等待时长,需配合nodelay、proxy_read_timeout、limit_conn等配置协同优化,并通过压测验证效果。

Nginx 的速率限制缓冲队列(burst)不是“放行超速请求”,而是为突发流量提供一个临时排队空间,让超出基础速率的请求不立刻被拒绝,而是等待令牌释放后再处理。配置高效的关键在于匹配业务响应时间、避免排队积压、防止用户感知卡顿。
用 burst 控制突发请求排队长度
burst 值设得过小,突增请求直接 503;设得过大,请求堆积导致延迟飙升甚至超时。合理值取决于两个因素:
- 后端平均响应时间(比如 API 平均耗时 200ms)
- 你愿意容忍的最大排队等待时长(比如不超过 2 秒)
例如:若 rate=10r/s,平均响应 200ms,则每秒可消化 5 个请求(1s ÷ 0.2s = 5)。此时 burst 设为 10~15 比较稳妥——相当于预留 1~2 秒的缓冲容量,既扛住短时脉冲,又不会让第 20 个请求等 4 秒才开始处理。
建议这样写:
-
limit_req zone=api_limit burst=12 nodelay; - 配合
limit_req_status 429;返回标准限流状态码,方便前端重试控制
nodelay 决定排队是否“可见”
不加 nodelay 时,burst 内的请求会被匀速释放(比如 12 个排队请求,在 1.2 秒内逐个放行),用户感觉是“变慢但不断”。加上 nodelay,只要还有令牌就立刻放行,没令牌就立刻 429 —— 用户要么秒响应,要么秒失败,无中间态。
适合场景:
- 登录、短信接口(不允许排队,防暴力枚举)
- 秒杀预热页(要快进快出,不堆请求)
不加 nodelay 更适合:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 普通 API 列表查询(允许轻微延迟,提升成功率)
避免 burst 和后端慢响应叠加失效
如果后端接口本身响应慢(如查库卡顿),即使 burst=20,也可能 20 个连接全挂住,新请求进来直接触发拒绝。这时需同步做:
- 在 location 中加
proxy_read_timeout 5s;防止 Nginx 等后端太久 - 配合
limit_conn conn_limit 16;控制每个 IP 最大并发连接数,防连接耗尽 - 日志里加
limit_req_log_level warn;记录排队超时事件,便于定位瓶颈
测试 burst 是否生效,别用单 curl
单次发 10 个 curl 不代表并发,真实效果要用压测工具验证:
-
ab -c 20 -n 100 http://your-api/(20 并发,共 100 请求) - 或
wrk -t12 -c100 -d10s http://your-api/
观察返回状态码分布:429 出现时机、响应时间 P95 是否稳定在预期范围内。
配置改完记得执行:
nginx -t && nginx -s reload
再用 curl -I http://localhost 看 Header 是否含 X-RateLimit-Limit 类字段(需配合 Lua 或 OpenResty 扩展才原生支持,纯 Nginx 不返回该头,但日志和状态码可验证)。










