可通过limit_req_zone配合X-Tenant-ID头实现租户级限流:用$http_x_tenant_id作限流键,为各租户分配独立计数器;在location中启用limit_req并设burst与nodelay;缺失头时用map按IP兜底或return 400拦截。

可以通过 limit_req_zone 指令配合自定义请求头(如 X-Tenant-ID)在 Nginx 层面对 API 流量做租户级限流,实现多租户隔离。核心是让每个租户拥有独立的限流桶,互不影响。
定义基于自定义头的限流区域
使用 $http_x_tenant_id 变量作为限流键,为每个租户分配独立计数器:
limit_req_zone $http_x_tenant_id zone=tenant_limit:10m rate=100r/s;
说明:
-
$http_x_tenant_id自动提取请求头X-Tenant-ID的值(Nginx 会将头名转为小写+下划线) -
zone=tenant_limit:10m分配 10MB 共享内存存储租户状态,可支撑数千租户 -
rate=100r/s表示每个租户单独限制为每秒 100 请求,不共享配额
在 upstream 或 location 中启用限流
将限流策略应用到 API 路由,并设置拒绝行为:
location /api/ {
limit_req zone=tenant_limit burst=200 nodelay;
proxy_pass http://backend_api;
}说明:
-
burst=200允许租户短时突发最多 200 个请求(进入延迟队列) -
nodelay表示不延迟处理——超出速率的请求立即返回 503,适合强隔离场景;若需平滑限流,可去掉该参数 - 若租户未携带
X-Tenant-ID,变量值为空字符串,所有无头请求会被归入同一“默认租户”,建议配合if或map做兜底处理
处理缺失租户头或非法值
避免空租户挤占资源,用 map 提供默认标识或拦截:
map $http_x_tenant_id $tenant_key {
"" "$remote_addr"; # 无头时按 IP 隔离
default $http_x_tenant_id;
}
limit_req_zone $tenant_key zone=tenant_limit:10m rate=100r/s;也可在 location 中校验头存在性:
if ($http_x_tenant_id = "") {
return 400 "Missing X-Tenant-ID";
}与负载均衡协同的关键点
限流在 Nginx 入口层生效,天然作用于整个集群流量入口,无需后端配合:
- 无论后端是轮询、ip_hash 还是 least_conn,限流都基于租户维度统一控制
- 租户 ID 由客户端或网关注入,确保一致性;不要依赖后端生成,否则无法前置限流
- 若使用 OpenResty,可结合
lua_shared_dict实现更复杂的租户分级配额(如免费版 10r/s、企业版 1000r/s)

















