多级限流是按业务风险分层、维度隔离、优先级协同的机制,分为全局(ip)、服务(域名)、接口(路径)三级,nginx取最严策略;需混合速率与并发限流,并支持基于用户身份的差异化控制。

多级限流不是简单叠加多个 limit_req,而是按业务风险分层、按维度隔离、按优先级生效的协同机制。核心在于让不同粒度的限制相互补充而非冲突,避免单点过载同时保留合理弹性。
按业务层级划分限流区
把流量控制拆成全局、服务、接口三级,各自独立定义 zone 和速率,Nginx 会逐条匹配并取最严策略生效:
-
全局层:用
$binary_remote_addr控制单 IP 总请求量,防止恶意扫描或爬虫泛滥,例如rate=200r/s -
服务层:用
$server_name或自定义变量(如$http_host)限制某域名或后端集群整体吞吐,例如rate=500r/s -
接口层:用
$request_uri或$http_x_user_id对高危路径(如支付、登录)做精细控制,例如rate=5r/s
配置时 zone 名称需唯一,且所有 limit_req 指令写在同一 location 块内,Nginx 自动取各 zone 中最小允许速率作为最终上限。
混合速率与并发限流
仅控速率无法防连接耗尽,仅控连接又无法压平突发峰值。关键路径应同时启用两类限制:
- 用
limit_req_zone+limit_req控制每秒请求数(漏桶/令牌桶) - 用
limit_conn_zone+limit_conn控制同一 IP 或服务的活跃连接数,尤其适用于上传、长轮询等场景 - 两者互不干扰:一个管“单位时间处理多少”,一个管“同一时刻能占几个连接”
例如对 /upload/ 路径,可设 limit_conn perip 3 防止单 IP 占满上传通道,再配 limit_req upload_limit burst=10 控制上传频率。
区分用户身份做差异化限流
真实业务中,普通用户、VIP 用户、内部调用方的容忍度不同。可通过请求头提取标识实现分级:
- 定义 zone 时使用
$http_x_user_role或$http_authorization解析后的用户类型 - 为 VIP 用户单独设宽松 zone(如
rate=50r/s),普通用户用严格 zone(如rate=5r/s) - 配合
map指令做动态映射,避免在 location 中硬编码判断逻辑
注意:header 值需可信(如经认证服务注入),不可直接信任客户端传入的任意字段。
设置合理的突发缓冲与拒绝行为
burst 不是“放开不管”,而是给系统留出响应余地;nodelay 决定是排队还是立即拒绝:
-
burst=20 nodelay:允许瞬间打进来 20 个额外请求,立刻处理,适合对延迟敏感的接口 -
burst=20(无 nodelay):多出的请求排队等待,超时则 503,适合后台任务类接口 - 搭配
limit_req_status 429统一返回状态码,便于前端识别限流并降级
burst 值建议设为 rate 的 20%–50%,过大可能掩盖后端瓶颈,过小则失去缓冲意义。











