2016-09-14 62 views
1

我发现ngx_http_limit_req_module可用于限制每次请求的最大数量。但在我的理解中,这适用于整个虚拟位置。我想要的是限制每个任意URL的速率。nginx - 包含变量的URL的限制请求率

示例: 我希望在客户端发出一个请求后,要求在特定客户端阻塞特定客户端的请求时间为/api/list/1/votes。但是,他仍然可以拨打/api/list/2/votes(但在呼叫之后,/2路线应该被阻止几秒钟)。 我最初的想法是使用正则表达式来定义每条路线的位置,以/votes结尾,但比(在该示例中)/1/2将被阻塞,这不是我想要的。

任何想法?

+0

您可以链接位置块。 – Smar

+0

我不认为这是一个选项,因为潜在路线的数量是无限的,因为id(上例中的1和2)是一个变量。 – n1try

回答

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指定创建一个名为“投票”来存储日志访问速度的限制网址的IP地址的共享内存区。我们设置rate=1r/s来指定每秒只允许从该IP提供一个请求。突发参数告诉Nginx如果超过5个队列从一个特定的IP开始丢弃请求。我已经放置的正则表达式([0-9])可以用任何符合你的路由的正则表达式替换。

请参阅this关于限制请求率的更多博客文章。

+0

这不会阻止来自客户端的所有与该正则表达式匹配的请求吗?参考上面的例子,我认为你的解决方案也会在调用'/ api/list/1/votes'之后阻止对'/ api/list/2/votes'的请求。 – n1try