nginx 作为策略执行入口,通过 limit_req_zone(支持用户、接口、ip+版本等多维 key)、burst+nodelay 缓冲突发、limit_conn 与 limit_req 双控、429 响应联动后端,实现分层限流与分级响应。

Nginx 本身不直接执行后端策略,但它能作为“策略执行入口”,把限流逻辑前置到流量最外层,再与后端协同形成分层防护。关键不是让 Nginx 去理解业务规则,而是用它做轻量、高速、可配置的初步过滤,把压力挡在后端之前,同时把必要上下文(如用户标识、接口路径、设备信息)透传给后端,由后端做更精细的决策。
按业务维度做精准限流
Nginx 的 limit_req_zone 支持任意变量作为 key,不只限于 IP:
- 用
$http_x_user_id按登录用户限流:后端在鉴权后注入该 header,Nginx 就能对每个用户单独计数 - 用
$uri或$args对高危接口(如 /login、/pay)单独设严苛阈值 - 组合使用:
limit_req_zone "$binary_remote_addr.$http_x_app_version" zone=app_limit:10m rate=100r/s,实现“IP+客户端版本”双因子限流
与后端联动实现分级响应
Nginx 不仅能拒绝请求,还能配合后端返回不同状态码或降级内容:
- 设置
limit_req_status 429,让前端统一识别限流,触发重试或友好提示 - 搭配
error_page 429 = @rate_limited,跳转到自定义降级页或返回 JSON 提示 - 后端在响应头中带
X-RateLimit-Remaining等字段,Nginx 可通过proxy_hide_header/add_header控制是否透传
避免单点瓶颈,用 burst + nodelay 平衡体验与保护
纯硬限流(如 rate=1r/s)易造成用户体验卡顿。合理用 burst 缓冲突发,再靠后端兜底:
-
burst=20 nodelay:允许瞬间 20 个请求打进来,Nginx 不排队延迟,快速放行 - 后端收到这批请求后,再基于 Redis 或本地滑动窗口做二次校验(如每分钟最多 60 次)
- 这样 Nginx 承担了 95% 的瞬时压力,后端只处理“已过第一关”的请求,负载更可控
连接数与请求速率双控
单一限流维度容易被绕过。建议组合使用:
-
limit_conn控并发连接数:防长连接耗尽 worker 进程 -
limit_req控请求频率:防短连接高频刷接口 - 例如:同一 IP 允许最多 10 个并发连接(
limit_conn addr 10),且每秒最多 5 个请求(limit_req zone=ip_limit burst=10)











