如何限制每分钟与Web应用程序的连接?

时间:2012-09-17 08:48:07

标签: php proxy nginx limiting

我曾尝试使用nginx(http://nginx.org/)来限制每分钟的请求数量。例如我的设置是:

server{
limit_req_zone $binary_remote_addr zone=pw:5m rate=20r/m; 
}
location{
limit_req zone=pw nodelay;
}

我在Nginx上发现的是,即使我每分钟尝试1次请求,我也可以在那一分钟内多次回来。当然,快速刷新页面会给我一个限制页面消息,这是一个“503服务暂时不可用”的返回代码。

我想知道可以应用哪种设置将请求完全限制为每分钟20个请求。我不是在寻找防洪,因为Nginx提供了这一点,如果一个页面被不断刷新,例如它限制了用户并让他们在一段时间之后有一些延迟(除非你应用了nodelay设置)。

如果除了HAProxy之外还有Nginx的替代品(因为它非常慢)。此外,我在Nginx上的设置充当了真实站点的反向代理。

1 个答案:

答案 0 :(得分:4)

正确的有两件事:

  1. limit_conn指令与limit_conn_zone结合使用,可以限制来自ip的(同时)连接数(参见http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn
  2. limit_req指令与limit_req_zone结合使用,可以限制每个时间单位给定ip的请求数(参见http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req
  3. 请注意:

    • 你需要在http块而不是serverblock中执行limit_conn_zone / limit_req_zone
    • 然后,您可以在服务器/位置块中使用带有limit_con / limit_req设置的etup区域(作为适当的)来引用您在http块中设置的区域名称

    因为您在下面说过,您希望限制请求,您需要limit_req指令。特别是每分钟最多获得5个请求,请尝试添加以下内容:

    http {
      limit_req_zone $binary_remote_addr zone=example:10m rate=5r/m;
    }
    
    server {
       limit_req zone=example burst=0 nodelay;
    }
    

    注意:显然将这些添加到现有的http /服务器块