nginx -限制包含变量的URL的请求速率

hjzp0vay  于 2023-01-29  发布在  Nginx
关注(0)|答案(2)|浏览(175)

我发现ngx_http_limit_req_module可以用来限制每次请求的最大数量,但在我的理解中,这适用于整个虚拟位置,我想要的是限制每个任意URL的速率。
示例:我希望在客户端发出一个请求后,针对特定客户端阻塞对/api/list/1/votes的请求30秒。但是,他应该仍然能够调用/api/list/2/votes(但是在那个调用之后,/2路由也应该被阻塞几秒钟)。我最初的想法是使用正则表达式为每个以/votes结束的路由定义一个位置,但是比(在示例中)/1/2将被阻塞,这不是我想要的。
有什么想法吗?

mpbci0fu

mpbci0fu1#

您可以将nginx配置设置为如下所示

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

location ~* ^/api/list/([0-9])/votes$ {
    # apply rate limiting
    limit_req zone=votes burst=5;
}

zone=votes:10m指定创建一个名为“votes”的共享内存区域,以存储访问速率受限URL的IP地址的日志我们设置rate=1r/s来指定每秒只允许一个来自该IP的请求被服务。burst参数告诉Nginx,如果来自特定IP的队列超过5个,则开始丢弃请求。我放置的正则表达式([0-9])可以替换为任何与您的路由匹配的正则表达式。
有关限制请求速率的更多信息,请参阅this博客文章。

tcbh2hod

tcbh2hod2#

您需要在密钥中包含id,如下所示:

limit_req_zone $vote_limit_key zone=votes:10m rate=1r/s;

map $request_uri $vote_limit_key {
  default ""; # ignore urls not matching, these will not be rate limited
  "~^/api/list/([0-9]+)/votes$" ${binary_remote_addr}$1;
}

location ~* ^/api/list/([0-9])/votes$ {
    # apply rate limiting
    limit_req zone=votes burst=5;
}

Map将匹配url,提取id并将其与$binary_remote_addr组合,以提供每个IP地址和id的唯一密钥。当然,您也可以修改Map以处理其他url,或默认为$binary_remote_addr以将所有其他url视为一个,并仅受IP地址限制。

相关问题