Nginx限流需按路径、用户等级、连接数分层设防:用$uri绑定接口级限流,map区分VIP/普通用户阈值,limit_conn防慢速攻击,并联动upstream健康状态实现动态熔断。

要在 Nginx 负载均衡边缘层用 limit_req 筑牢限流防线,核心是“按需绑定、分层设防、精准触发”——不是给整个 upstream 加一刀切限制,而是把限流策略下沉到具体 location,并与 upstream 的健康状态、业务路径、用户身份联动起来。
按接口路径绑定限流,避免误伤非敏感流量
不同后端接口承载能力差异大,登录、下单、搜索等路径必须单独防护。直接用 $uri 定义限流键,比只用 IP 更精准:
- 在
http块中声明:limit_req_zone $uri zone=byuri:10m rate=5r/s;(每个唯一路径每秒最多 5 次) - 在对应 location 中启用:
location = /api/v1/login {<br> limit_req zone=byuri burst=15 nodelay;<br> proxy_pass http://auth_upstream;<br> } - 用
=精确匹配,防止正则开销和路径歧义;加nodelay让超速请求立刻返回 503,不堆积连接
结合 upstream 健康状态动态跳过故障节点
限流不能脱离后端真实负载。光控请求数不够,还要让 Nginx 主动感知节点异常并绕行:
- 为 upstream 配置主动健康检查(需 nginx-plus 或 openresty)或基础失败判定:
upstream order_upstream {<br> server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;<br> server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;<br> } - 在 location 中开启自动重试与熔断:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
这样当某节点连续失败,Nginx 会临时剔除它,把流量导向健康实例,相当于轻量级熔断
区分用户等级,实现灰度限流策略
VIP 用户和普通用户不该共用同一套阈值。可通过请求头提取身份,再映射到不同限流区:
- 用
map解析用户等级:
map $http_x_user_level $limit_key {<br> default $binary_remote_addr;<br> "vip" "$binary_remote_addr-vip";<br> } - 定义两个限流区:
limit_req_zone $limit_key zone=vip_limit:10m rate=200r/s;<br> limit_req_zone $binary_remote_addr zone=normal_limit:10m rate=20r/s; - 在 location 中按需调用:
limit_req zone=vip_limit burst=200 nodelay;或limit_req zone=normal_limit burst=50;
叠加连接数限制,防御慢速攻击
单 IP 并发连接过多也会压垮 upstream,尤其在长连接或 WebSocket 场景下。建议在关键接口 location 内补充连接限流:
- 全局声明连接限制区:
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m; - 与
limit_req同时启用:
location /api/v1/pay {<br> limit_req zone=pay_limit burst=5;<br> limit_conn conn_per_ip 10;<br> proxy_pass http://payment_upstream;<br> }
这样既控请求频次,又控并发连接数,双保险防住 CC 和 Slowloris 类攻击


















