NGINX-限制请求以防止滥用


28

我之所以要这样做,是因为用户使用JavaScript使用我们的API进行开发,并且一些开发人员搞砸了,并导致访问者用AJAX请求猛击服务器。发生这种情况时,我希望能够将API请求限制为每分钟50个请求,或者达到某种程度。

注意:(特别是数据库密集型资源,因此可能是在路径级别而不是服务器范围内(例如,节流阀“ / json_api /”,但不是“ / static /”))。

Answers:


36

这可以通过使用带有Nginx 的LimitReqModule来完成。但是,如果这是用于反向代理的,则您可能想尝试HAProxy支持的新速率限制

我发现nginx速率限制有点令人困惑,无法获得所需的确切速率。

但是您基本上有类似以下内容:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

在该http部分中,然后在该location部分中的该server部分中进行以下操作:

limit_req zone=default burst=10 nodelay;

为了不像某个部分那样使用它,/static您只需将其分隔开location,而不将其包含在limit_req指令中(或取反)。


谢谢。您能解释一下这些东西在做什么(区域,突发,节点布局)吗?而且,您是否要放zone=limit_req_zone
orokusaki 2010年

老实说,我不能很好地向他们解释,这就是为什么我觉得这只是在混淆。我在我提供的链接中对迈克尔的解释听起来像是可行的。就您的第二个问题而言,我不相信我有错别字...我链接到的模块文档中的示例可能会有所帮助。
凯尔·勃兰特

2
Nginx Wiki页面上记录了有关速率限制模块的区域,突发和节点布局,这些链接已经从上面的答案链接到了。
马克·斯托斯伯格

凯尔(Kyle),您知道是否有一种方法可以将每个位置的速率限制与另一个触发器(例如Authorization-Header)结合起来。就我而言,我可能想限制特定用户的费率。
尼尔斯2014年

1
@Nils AFAICS可以使用$http_authorization变量定义一个新区域,在该区域中密钥是此类标头而不是IP地址(即)limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/s,然后per_user在要对每个用户进行速率限制的位置部分中使用该区域。未经测试,我只阅读了文档和nginx变量列表...让我知道是否可以尝试!
idrarig 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.