burst参数本质是为缓存穿透设置柔性缓冲时间窗,与rate配合将突发回源请求排队匀速转发,用时间换稳定性,而非提升吞吐;需结合源站压测能力、业务延迟容忍度及共享内存容量合理配置,并配合$uri限流、cache_lock等机制协同防护。

配置 burst 参数不是为了“放大”限流阈值,而是给瞬时流量一个可控的缓冲空间,让超出平均速率的请求先排队或快速通过,避免直接打垮后端或粗暴返回 503。
先定义合理的限流区域(zone)
必须在 http 块中声明共享内存区,key 推荐用 $binary_remote_addr:
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
这表示每秒最多处理 10 个请求,10MB 内存可存约 16 万个 IP 的状态。
若需按用户 ID 限流(如防薅羊毛),改用 $arg_user_id 或 $http_x_user_id,并确保前端透传。
代理环境(如 CDN、LB)下,$binary_remote_addr 会变成代理 IP,应改用可信的 $http_x_forwarded_for 并配合 set_real_ip_from。
在 location 中启用 burst 缓冲
只对关键路径启用,比如 /api/order 或 /login:
limit_req zone=api burst=30;
表示允许最多 30 个请求暂存排队,超出即拒(默认行为)。
limit_req zone=api burst=30 nodelay;
表示超出 rate 但未超 burst 的请求立刻放行,不排队——适合下单、登录等强实时接口,但务必确认后端压测能扛住这波并发。
limit_req zone=api burst=30 delay=15;
表示前 15 个超限请求被匀速延迟放行(响应头带 X-RateLimit-Delay),后 15 个直接拒绝。
burst 值怎么设才靠谱
不能拍脑袋填,要结合业务类型和实际 QPS:
- 读接口(如商品详情):日常 QPS 是 50,burst 可设为 100~150,相当于容纳 2 秒左右突发。
- 写接口(如下单):慎用纯排队,优先选 burst + nodelay,但必须确认后端已压测过 30 笔并发下单。
- 健康检查或静态资源:burst=0 更合适,避免干扰监控或缓存命中。
- burst 过大(如 1000)+ nodelay = 实际上没限流,只是把失败延后到内存耗尽。
让限流行为可观察、可调优
配完不看日志等于白配:
- 加日志变量:log_format main '$limit $limit_key $limit_rate';,能看清哪个 key 触发了限流。
- 调高日志级别:limit_req_log_level warn;,记录所有排队/拒绝动作,不只是 error。
- 压测验证:用 wrk 或 hey 发 50 并发请求,观察响应时间是否呈固定间隔(如 100ms、200ms…),确认漏桶节奏生效。











