分享最新优惠信息
购买主机更加划算

Nginx设置最大连接数限制(请求数)简单方法

NGINX附带了各种模块,允许用户控制其网站、Web应用程序以及其它Web资源的流量。限制流量或访问的关键原因之一是防止某些类型的滥用或攻击,例如DoS(拒绝服务)攻击。

在NGINX系统中,主要有三种限制使用或流量的方法:

  1. 限制连接(请求)的数量。
  2. 限制请求的速率。
  3. 限制带宽。

上述NGINX流量管理方法可以根据使用实例配置为基于定义的密钥进行限制,最常见的是客户端的IP地址。NGINX还支持其他变量,例如cookie会话等等。

在本文当中,小编将简单介绍如何限制NGINX中的连接数以保护网站/应用程序的安全。

需要注意的是,只有当服务器正在处理请求并且整个请求标头已被读取时, NGINX才会考虑限制连接。因此,并非所有客户端连接都被计算在内。

Nginx

一、限制NGINX中的连接数

首先,需要使用limit_conn_zone指令定义一个共享内存区域,用于存储各种键的连接指标。如前所述,密钥可以是文本、变量(例如客户端的远程IP地址)或两者的组合。

这个在HTTP上下文中有效的指令有两个参数:key(键)和zone(区域)(格式为zone_name:size)。

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

要设置返回给被拒绝请求的响应状态代码,请使用将HTTP状态代码作为参数的limit_conn_status指令。它在 HTTP、服务器和位置上下文中有效。

limit_conn_status 429;

要限制连接,请使用limint_conn指令设置要使用的内存区域和允许的最大连接数,如以下配置片段所示。该指令在HTTP、服务器和位置上下文中有效。

limit_conn  limitconnbyaddr 50;

以下是完整的配置示例:

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
limit_conn_status 429;

server {
    listen 80;
    server_name test.idccoupon.com;
    root /var/www/html/test.idccoupon.com/build;
    index index.html;

    limit_conn   limitconnbyaddr  50;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
}

Nginx连接限制

保存文件并关闭它。

然后通过运行以下命令检查NGINX配置是否正常,命令如下:

$ sudo nginx -t

接下来,重新加载NGINX服务以影响最近的更改:

$ sudo systemctl reload nginx

二、检查Nginx 连接限制

当客户端超过允许的最大连接数时,NGINX会向客户端返回“ 429 Too many requests ”错误,并在错误日志文件中添加如下条目:

2022/04/26 00:14:00 [error] 597443#0: *127 limiting connections by zone "limitconnbyaddr", client: x.x.x.x, server: test.idccoupon.com, request: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "test.idccoupon.com"

Nginx连接限制错误

三、限制Nginx与应用程序连接数

当然,你还可以通过使用$server_name变量来限制给定服务器的连接数,示例如下:

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $server_name zone=limitbyservers:10m;
limit_conn_status 429;

server {
    listen 80;
    server_name test.idccoupon.com;
    root /var/www/html/test.idccoupon.com/build;
    index index.html;

     limit_conn  limitbyservers  2000;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
}

上述配置使NGINX能够将与为应用程序test.idccoupon.com提供支持的虚拟服务器连接总数限制为2000个连接。

注意:基于客户端IP限制连接有一个缺点,因为你最终可能会限制不止一个用户的连接,特别是如果访问应用程序/网站的许多用户都在同一个局域网内的话,那么他们可能都将无法访问。

在这种情况下,可以使用NGINX中可用的一个或多个变量,这些变量可以在应用程序级别识别客户端,例如cookie会话。

总结

以上就是Nginx设置最大连接数限制(请求数)的简单方法,如果在使用过程中,如果发现某一异常IP大量请求网页的话,可以通过上述方法进行设置,以保证网站的正常访问。

未经允许不得转载:惠主机 » Nginx设置最大连接数限制(请求数)简单方法