我发现ngx_http_limit_req_module可用于限制每次请求的最大数量。但据我了解,这适用于整个虚拟位置。我想要的是限制每个任意URL的速率。
实施例:
我希望在客户端发出一个请求后30秒内为特定客户端阻止/api/list/1/votes
的请求。但是,他仍然可以调用/api/list/2/votes
(但在此调用之后,/2
路由也会被阻止几秒钟)。
我最初的想法是使用正则表达式来定义以/votes
结尾的每条路线的位置,但是(在示例中)/1
和/2
将被阻止,这不是什么我想要。
有什么想法吗?
答案 0 :(得分:0)
您可以将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博文。