Nginx轮询场景下可通过limit_req模块按客户端IP统一限流:在http块定义基于$binary_remote_addr的限流区域,location中启用limit_req对接upstream,并在代理环境下用real_ip模块还原真实IP,支持多接口差异化限流。

在 Nginx 轮询(upstream 默认负载均衡策略)场景下,限制单个客户端 IP 的每秒请求速率,核心思路不变:限流必须在流量入口统一执行,与后端是否轮询无关。Nginx 的 limit_req 模块天然支持该场景,只需确保配置放在 http 或 server 块中、生效于目标 location,即可对所有转发到轮询后端的请求统一限流。
1. 定义基于 IP 的限流区域(全局生效)
在 http 块中声明共享内存区,按客户端真实 IP 限流:
-
$binary_remote_addr比$remote_addr更省内存,推荐使用 -
zone=ip_rate:10m表示分配 10MB 共享内存,可容纳约 16 万个 IP 的状态 -
rate=5r/s表示长期平均允许每秒 5 个请求(实际以毫秒级精度平滑控制)
示例配置:
http {limit_req_zone $binary_remote_addr zone=ip_rate:10m rate=5r/s;
}
2. 在 location 中启用限流并对接轮询 upstream
把 limit_req 放在具体接口路径下(如 /api/login),再通过 proxy_pass 转发给轮询组:
-
burst=10允许瞬时最多排队 10 个请求(超出部分按策略处理) -
nodelay表示不等待令牌,超出 burst 的请求立即返回 503;去掉则排队等待,适合容忍短时突增 - 轮询 upstream 不影响限流逻辑——Nginx 在代理前就已完成速率判断
示例配置:
upstream backend_pool {server 10.0.1.10:8080;
server 10.0.1.11:8080;
}
server {
location /api/login {
limit_req zone=ip_rate burst=10 nodelay;
proxy_pass http://backend_pool;
}
}
3. 处理代理环境下的真实 IP(关键!)
如果 Nginx 前还有 CDN、WAF 或其他代理,$binary_remote_addr 获取的是上一级代理 IP,不是用户真实 IP。需配合 real_ip 模块还原:
- 在
http块开头添加:set_real_ip_from 192.168.0.0/16;(填你可信代理网段) - 设置:
real_ip_header X-Forwarded-For;或X-Real-IP(依上游实际头字段而定) - 然后改用
$binary_remote_addr或$remote_addr(还原后)做限流 key
4. 针对不同接口差异化限流(进阶)
轮询架构下,可为不同业务路径配置独立限流策略,避免“一刀切”:
- 短信接口:
limit_req_zone $binary_remote_addr zone=sms_limit:5m rate=1r/m;(每分钟 1 次) - 下载接口:
limit_req_zone "$binary_remote_addr$uri" zone=dl_limit:10m rate=2r/s;(按 IP+路径区分) - 管理后台:
limit_req_zone $cookie_admin_id zone=admin_limit:5m rate=30r/m;(按登录态 ID,更精准)
所有这些 zone 都可共存,各自独立计数,互不影响轮询转发逻辑。


















