生产环境接口限流需兼顾有效性、可维护性与业务适配性,核心是稳定义规则、准确定位应用位置、合理设计突发策略;须用$binary_remote_addr在http块顶部统一定义限流区域,共享内存至少10m;按路径/接口粒度差异化限流,通过location+set动态构造限流键;burst与nodelay组合需匹配业务语义;并叠加连接数限制与429友好响应。

生产环境接口限流不能只靠“设个 rate=10r/s”应付,得兼顾有效性、可维护性和业务适配性。核心是三件事:限流规则定义要稳、应用位置要准、突发策略要合理。
限流区域定义必须用 $binary_remote_addr + 足够内存
在 http 块顶部统一定义,避免分散遗漏:
- 必须用 $binary_remote_addr,不是 $remote_addr —— IPv6 地址字符串太长,会导致哈希冲突,部分 IP 限流失效
- 共享内存至少 10m(推荐):1m 内存约存 1.6 万个会话,10m 可支撑 15–30 万活跃 IP,中小规模高并发足够;流量更大时按需上调
- 示例:limit_req_zone $binary_remote_addr zone=api_limit:10m rate=20r/s;
按路径/接口粒度差异化限流
不同接口风险和容忍度差异大,不能一刀切。用 location + set 动态构造限流键是最轻量、最可控的方式:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 登录接口(防爆破):set $limit_key "$binary_remote_addr-login"; + 单独 zone,rate=1r/s,burst=3
- 短信验证码(防轰炸):set $limit_key "$binary_remote_addr-sms"; + rate=1r/m,burst=1
- 公开 API(防爬):set $limit_key "$binary_remote_addr-api"; + rate=50r/m,burst=10
- 静态资源(不干预):set $limit_key ""; —— 空值会让 Nginx 自动跳过限流
burst 和 nodelay 组合要匹配业务语义
这不是参数堆砌,而是对“突发”的明确表态:
- limit_req zone=api_limit burst=15 nodelay; → 首包快场景(如秒杀入口),前 15 个请求立刻放行,第 16 个起严格按 20r/s 放行
- limit_req zone=api_limit burst=10; → 普通 API,允许排队缓冲,超 10 个才返回 503,用户体验更平滑
- limit_req zone=api_limit burst=0; → 敏感管理接口,拒绝一切排队,超速即拒,保底稳定性
配套防护:连接数限制 + 错误响应优化
限流只是第一道防线,还需叠加连接控制与友好反馈:
- 加一层 并发连接限制:在 http 块定义 limit_conn_zone $binary_remote_addr zone=conn_limit:10m;,在 location 中用 limit_conn conn_limit 20; 防慢速攻击
- 把 503 改成 429 并返回 JSON 提示:用 error_page 503 =429 /_limit_exceeded; + 内部 location 返回标准限流响应体
- 日志中记录是否触发限流:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$limit"(需开启 limit_req_log_level)

















