1

我尝试使用 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 上的设置也充当了真实站点的反向代理。

4

1 回答 1

5

没错,有两件事:

  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

笔记:

  • 您需要在 http 块而不是 serverblock 中执行 limit_conn_zone/limit_req_zone
  • 然后,您可以使用带有 limit_con/limit_req 设置的 etup 区域在 server/location 块内引用您在 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/server 块中

于 2012-09-17T10:26:51.447 回答