Nginx不直接限制到后端集群的连接速率,而是通过limit_req模块对客户端请求限流,再经upstream分发;需在http块定义限流区、location中启用,并可结合limit_conn防慢攻击。

一、核心思路:限流前置 + 负载均衡后置
所有限流逻辑必须放在 location 或 server 块中,在 proxy_pass 执行前生效。Nginx 的 limit_req 模块基于客户端标识(如 IP)统计并控制请求进入速率,再由 upstream 按策略分发——这才是生产环境最可靠、最易维护的做法。
二、关键配置步骤
1. 定义全局限流区域(http 块内)
使用 $binary_remote_addr 精确识别客户端 IP,避免哈希冲突:
limit_req_zone $binary_remote_addr zone=backend_limit:10m rate=20r/s;-
zone=backend_limit:共享内存区名,10MB 可存储约 16 万个 IP 状态 -
rate=20r/s:每秒最多放行 20 个请求(可根据后端集群总吞吐反推)
2. 在负载均衡入口启用限流(server → location 块)
确保限流在 proxy_pass 之前执行:
location / {limit_req zone=backend_limit burst=40 nodelay;proxy_pass http://my_backend_pool;proxy_set_header X-Real-IP $remote_addr;}
说明:burst=40 允许瞬时突发 40 个请求(缓冲队列),nodelay 表示超出速率的请求立即拒绝(返回 503),不排队等待。若需平滑延迟,可去掉 nodelay。
三、配合后端集群特性的增强策略
按业务路径差异化限流
不同接口压力差异大,应分而治之:
location /api/v1/pay { limit_req zone=pay_limit burst=5; proxy_pass http://payment_upstream; }location /api/v1/search { limit_req zone=search_limit burst=100; proxy_pass http://search_upstream; }
叠加连接数限制防慢攻击
单 IP 并发连接过多也会压垮后端,建议补充:
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;-
limit_conn conn_per_ip 30;(放在同一 location 内)
四、验证与调优要点
- 用
ab -n 1000 -c 50 http://your-domain/模拟压测,观察返回 503 比例是否符合预期 - 检查 Nginx error log 中
limiting requests日志,确认限流已触发 - 后端集群总处理能力 = 单机 QPS × 实例数 × 利用率(建议留 20% 余量),据此倒推
rate值 - 避免将
rate设得过高导致后端雪崩;也不宜过低影响正常用户体验











