Nginx:limit_conn 与上游 max_conns(在位置上下文中)

Nginx: limit_conn vs upstream max_conns (in location context)

环境:Nginx 1.14.0(有关详细信息,请参阅 dockerfile)。

限制特定位置的并发连接数
在服务器中,可以使用两种方法 - limit_conn (third example for all ips)
upstream max_conns.
这两种方法的工作方式有区别吗?
有人可以解释或参考解释吗?

使用上游限制的例子max_conns:

http {
   upstream foo{
     zone upstream_foo 32m;
     server some-ip:8080 max_conns=100;
   }

   server {
    listen 80;
    server_name localhost;

    location /some_path {
       proxy_pass http://foo/some_path;
       return 429;
    }
   }  
}

限制使用 limit_conn:

http {

   limit_conn_zone $server_name zone=perserver:32m;

   server {
    listen 80;
    server_name localhost;

    location /some_path {
       proxy_pass http://some-ip:8080/some_path;
       limit_conn perserver 100;
       limit_conn_status 429;
    }
   }  
}

upstream max_conns 是从 nginx 服务器到上游代理服务器的连接数。 max_conns 更重要的是确保后端服务器不会过载。假设您有 5 个 nginx 可以发送到的上游服务器。可能其中一个功率不足,因此您限制了它的连接总数以防止它过载。

limit_conn 是从客户端到 nginx 服务器的连接数,用于限制对 nginx 服务器的请求的滥用。例如,对于某个位置,您可以说一个 IP 在达到最大值之前只能有 10 个打开的连接。

另请注意,如果已达到 max_conns 限制,则可以将请求放在 queue 中进行进一步处理,前提是 queue (NGINX Plus) 指令还包括设置队列中可以同时存在的最大请求数:

upstream backend {
    server backend1.example.com max_conns=3;
    server backend2.example.com;
    queue 100 timeout=70;
}

如果queue被请求填满或者在可选超时参数指定的timeout期间无法选择上游服务器,或者省略队列参数,客户端收到错误(502)。