Pesquisa de site

Como limitar a largura de banda da rede no servidor Web NGINX


Anteriormente, em nossa série de gerenciamento de tráfego e controles de segurança NGINX, discutimos como limitar o número de conexões que o mesmo cliente pode fazer com seus recursos da web, usando parâmetros de identificação do cliente, como endereço IP. Também abordamos como limitar a taxa de solicitações (limitar a taxa na qual um cliente pode fazer solicitações) para seus recursos da web.

Para garantir que a largura de banda de uso do seu aplicativo não seja gasta por um único cliente, você precisa controlar as velocidades de upload e download por cliente. Este é um controle de segurança comum do NGINX contra ataques de DoS (negação de serviço) de usuários mal-intencionados que estão apenas tentando abusar do desempenho do site.

Nesta terceira parte da série, explicaremos como limitar a largura de banda da rede no servidor web NGINX.

Limitando a largura de banda no NGINX

Para limitar a largura de banda no NGINX, use a diretiva limit_rate que limita a taxa de transmissão de resposta para um cliente. É válido em HTTP, servidor, local e instrução if dentro de um local bloco e especifica o limite de taxa para um determinado contexto em bytes por segundo por padrão. Você também pode usar m para megabytes ou g para gigabytes.

limit_rate 20k;

Outra diretiva relacionada é limit_rate_after, que especifica que a conexão não deve ter taxa limitada até que uma determinada quantidade de dados tenha sido transferida. Esta diretiva pode ser definida no HTTP, servidor, localização e “instrução if dentro de um bloco de localização”.

limit_rate_after 500k;

Aqui está um exemplo de configuração para limitar um cliente a baixar conteúdo por meio de uma única conexão a uma velocidade máxima de 20 kilobytes por segundo.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    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";

       
   }
   location /documents {
        limit_rate 20k;
        limit_rate_after 500k;  
}
}

Depois de adicionar as configurações necessárias explicadas acima, salve as alterações e feche o arquivo. Após, verifique se a sintaxe de configuração do NGINX está correta, assim:

sudo nginx -t

Se tudo estiver OK, recarregue o serviço NGINX para efetuar as alterações mais recentes:

sudo systemctl reload nginx

Limitando a largura de banda e o número de conexões no NGINX

Com a configuração acima, o cliente pode abrir diversas conexões para aumentar a largura de banda. Portanto, além disso, você também pode limitar as conexões por cliente usando um parâmetro como um endereço IP, como vimos antes.

Por exemplo, você pode limitar uma conexão por endereço IP.

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 testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        limit_conn   limitconnbyaddr  5;

        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";

       
   }
   location  /documents {
        limit_rate 50k;
        limit_rate_after 500k;  
        limit_conn   limitconnbyaddr  1;
}
}

Limitando a largura de banda dinamicamente no NGINX

Como valor de parâmetro para a diretiva limit_rate, você pode especificar variáveis para limitar dinamicamente a largura de banda. É particularmente útil em situações onde a taxa deve ser limitada dependendo de uma determinada condição.

Neste exemplo, estamos usando o bloco map. Ele permitiu criar uma nova variável cujo valor depende dos valores de uma ou mais variáveis originais ($slow e $limit_rate) especificadas no primeiro parâmetro.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $slow $limit_rate {
    1     20k;
    2     30k;
}

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    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";
   }
   location /documents {
        limit_rate $limit_rate;
        limit_rate_after 500k;
}
}

Aqui está outro exemplo de configuração para ilustrar a limitação dinâmica de largura de banda no NGINX. Esta configuração permite que o NGINX limite a largura de banda com base na versão TLS. A diretiva limit_rate_after 512 implica a taxa limite após o envio dos cabeçalhos.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $ssl_protocol $response_rate {
    "TLSv1.1" 50k;
    "TLSv1.2" 100k;
    "TLSv1.3" 500k;
}

server {
    listen 443 ssl;
    ssl_protocols       TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_certificate     /etc/ssl/testapp.crt;
    ssl_certificate_key   /etc/ssl/testapp.key;

    location / {
        limit_rate       $response_rate; # Limit bandwidth based on TLS version
        limit_rate_after 512;
        proxy_pass       http://api_service;
    }
}

Isso é tudo que tínhamos para você nesta parte da série. Continuaremos a cobrir mais tópicos relacionados ao gerenciamento de tráfego e controles de segurança do NGINX. Mas, como sempre, você pode fazer perguntas ou compartilhar suas ideias sobre este guia por meio do formulário de feedback abaixo.