使用带令牌的NGINX速率限制

时间:2017-10-05 22:33:03

标签: api nginx rate-limiting

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

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

  

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

此区域使用用户IP地址作为标识来评估使用限制。通常,人们使用相同的IP地址访问我们的系统。

我想知道是否可以使用用户tokenId作为速率限制的标识。我们的所有请求都在网址中包含tokenID参数: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";
      }
      ...
   }
}

变量$tokenid确实包含确切的令牌(经过测试,在响应中添加了一个标头),但它似乎没有更新limit_req_zone使用的值。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

server {
   ...
   limit_req zone=limit burst=10;
   ...
}