应按http方法+路径组合构造限流key,如$request_method:$uri;对高危接口用map识别并单独限流;结合x-user-id实现用户级隔离,为空值时用ip兜底。

对 API 接口的每个方法(如 GET /users、POST /users)做细粒度限流,核心是让限流 key 包含 HTTP 方法 + 路径,而不是只按 IP 或粗粒度路径。Nginx 本身不直接识别 RESTful 方法语义,但可通过变量组合精准构造区分度高的限流标识。
用 $request_method + $uri 构造唯一限流 key
在 http{} 块中定义 zone,把请求方法和 URI 拼接作为 key:
limit_req_zone "$request_method:$uri" zone=method_uri:10m rate=5r/s;- 这样
GET:/api/v1/orders和POST:/api/v1/orders就是两个独立计数桶 - 若需忽略查询参数(如
?page=1),改用$request_method:$host$uri或配合map清洗 $args
为高频方法单独设严苛策略
某些方法天然更耗资源,应区别对待。例如导出接口只允许 POST 且频次极低:
- 先用
map标记高危路径:map $request_uri $is_export {<br> ~^/api/v1/export 1;<br> default 0;<br> } - 再定义专用 zone:
limit_req_zone $http_x_user_id zone=export_per_user:10m rate=1r/m; - 在对应 location 中启用:
location /api/v1/export {<br> if ($is_export) { limit_req zone=export_per_user burst=1 nodelay; }<br> proxy_pass http://backend;<br> }
结合身份标识实现“同用户+同方法”双维度控制
仅靠方法+路径仍可能被多账号滥用。叠加可信用户标识,才能真正落到业务主体:
- 提取头信息:
limit_req_zone "$http_x_user_id:$request_method:$uri" zone=user_method_uri:10m rate=3r/s; - 该 key 可确保“用户 A 的 POST /login”和“用户 B 的 POST /login”完全隔离
- 注意:需确保
X-User-ID由可信网关注入,不可由客户端直传
避免空值导致 key 失效
如果 $http_x_user_id 为空,整个 key 变成 ":GET:/api/v1/info",所有未带身份的请求都挤进同一个桶——这会误伤合法匿名接口或导致绕过:
- 用
map提供兜底值:map $http_x_user_id $user_key {<br> "" $binary_remote_addr;<br> default $http_x_user_id;<br> } - 再基于
$user_key构建复合 key,兼顾安全与健壮性
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











