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

Usm*_*man 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

我想知道可以应用什么样的设置来将请求限制为每分钟 20 个请求。我并不是在寻找防洪保护,只是因为 Nginx 提供了这个功能,如果页面持续刷新,例如它会限制用户并在一段时间后让他们在延迟一段时间后返回(除非您应用 nodelay 设置)。

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

cob*_*aco 5

正确的有2件事:

  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 设置(视情况而定)的具有设置区域的服务器/位置块中引用您在 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;
}
Run Code Online (Sandbox Code Playgroud)

注意:显然将这些添加到您现有的 http/server 块中