使用带有令牌的 NGINX 速率限制

Mau*_*ano 3 api nginx rate-limiting

我需要将对 API 的访问限制为每秒 10 个请求。

这是我根据他们的文档使用的区域:

limit_req_zone $binary_remote_addr zone=mylimit:10m 速率=10r/s;

该区域以用户IP地址为标识,对使用限制进行评级。人们通常使用相同的 IP 地址来访问我们的系统。

我想知道是否可以使用用户 tokenId 作为速率限制的标识。我们所有的请求都tokenID在 URL 中包含一个参数:www.example.com/api/events/?tokenID=*****

有什么线索吗?

谢谢。

更新

我尝试创建区域: limit_req_zone "$tokenid" zone=limit:10m rate=1r/s;(1 r/s 用于测试)并提取变量,$tokenid如下所示:

limit_req_zone "$tokenid" zone=limit:10m rate=1r/s;

server {
   ...

   location ~ \.php {
      ...
      if ($args ~* "tokenID=([^&]+)") {
          set $tokenid "$1";
      }
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

该变量$tokenid确实包含确切的令牌(已测试向响应添加标头),但它似乎没有更新limit_req_zone.

Mau*_*ano 6

@TarunLalwani 提出的建议确实有效。

我应该使用$arg_tokenID而不是从 URI 中提取它并将其设置到变量中。

最终的配置文件如下所示:

limit_req_zone "$arg_tokenID" zone=limit:10m rate=10r/s;

server {
   ...
   limit_req zone=limit burst=10;
   ...
}
Run Code Online (Sandbox Code Playgroud)