可通过limit_req_zone配合X-API-Key实现按租户限速,并与upstream协同完成多租户负载均衡;需用map校验并哈希API Key为安全键,location中启用limit_req及proxy_set_header透传,配合429状态码和健壮性防护提升生产可靠性。

可以通过 limit_req_zone 指令配合自定义请求头(如 X-API-Key)实现按租户(即每个 API Key)独立限速,再结合 upstream 实现多租户负载均衡。关键在于将 API Key 作为限速键(key),并确保其在请求链路中稳定、可信地传递。
提取并验证 API Key 作为限速 key
Nginx 默认不信任客户端传入的任意 header,需先做基础校验,再用于限速。推荐做法是:用 map 提取 X-API-Key,过滤空值或非法格式,并映射为安全键名(例如哈希后截取)。
示例配置片段:
map $http_x_api_key $api_key_hash {
"" ""; # 空值跳过限速
default $http_x_api_key;
}
limit_req_zone $api_key_hash zone=perkey:10m rate=100r/s;
说明:
- $http_x_api_key 是 Nginx 内置变量,对应请求头 X-API-Key;
- map 块确保只有非空、合法的 key 才参与限速,避免空 key 占用共享内存;
- 若需更高安全性(防碰撞/枚举),可用 hash 或 sha256 函数进一步处理(需启用 ngx_http_map_module 及支持哈希的版本)。
在 location 中启用限速并透传 key 到上游
限速必须在具体路由(location)中调用 limit_req,同时确保 API Key 被原样转发给后端服务,用于鉴权和租户识别。
- 使用
limit_req zone=perkey burst=50 nodelay;控制突发流量 - 用
proxy_set_header X-API-Key $http_x_api_key;显式透传,避免被上游忽略 - 建议添加
limit_req_status 429;统一返回限速状态码
与 upstream 负载均衡协同工作
限速本身不干涉负载均衡逻辑,但要注意两点:一是限速在 proxy 前执行(即在 Nginx 接收请求时就决策),二是各 worker 进程共享 limit_req_zone 内存,天然支持多实例横向扩展下的租户级一致性限速。
典型 upstream 配置无需改动,只需保证它被 proxy_pass 正确引用:
upstream backend_cluster {
least_conn;
server 10.0.1.10:8000;
server 10.0.1.11:8000;
keepalive 32;
}
location /api/ {
limit_req zone=perkey burst=50 nodelay;
proxy_pass http://backend_cluster;
proxy_set_header X-API-Key $http_x_api_key;
proxy_set_header Host $host;
}
说明:
- least_conn 适合后端处理能力不均的场景;若需按租户亲和(如会话保持),可改用 ip_hash 或基于 $http_x_api_key 的 hash;
- 限速统计由 Nginx 自动完成,与 upstream 中服务器数量无关;
- 若部署了多台 Nginx(如前置 LB),需改用分布式限速方案(如 Redis + lua-resty-limit-traffic),单机 limit_req_zone 仅适用于单节点或共享内存集群。
增强健壮性的补充建议
生产环境建议增加以下防护层:
- 用
if ($http_x_api_key = "") { return 400; }拒绝无 key 请求,避免绕过限速 - 限制
X-API-Key长度(如map中正则匹配^[a-zA-Z0-9_\-]{12,64}$)防止恶意超长头耗尽内存 - 对高优先级租户,可额外定义
limit_req_zone $api_key_hash zone=perkey_premium:10m rate=500r/s;并通过map分流 - 开启
limit_req_log_level warn;记录触发限速的请求,便于审计和容量分析
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










