Pesquisa de site

Como limitar o número de conexões (solicitações) no NGINX


O NGINX vem com vários módulos para permitir que os usuários controlem o tráfego em seus sites, aplicativos da web e outros recursos da web. Uma das principais razões para limitar o tráfego ou o acesso é evitar abusos ou ataques de certos tipos, como ataques de DoS (negação de serviço).

Existem três maneiras principais de limitar o uso ou o tráfego no NGINX:

  1. Limitando o número de conexões (solicitações).
  2. Limitando a taxa de solicitações.
  3. Limitando a largura de banda.

As abordagens de gerenciamento de tráfego NGINX acima, dependendo do caso de uso, podem ser configuradas para limitar com base em uma chave definida, sendo a mais comum o endereço IP de um cliente. O NGINX também oferece suporte a outras variáveis, como cookie de sessão e muito mais.

Nesta primeira parte de nossa série de três partes, discutiremos como limitar o número de conexões no NGINX para proteger seus sites/aplicativos.

  • Como limitar o número de conexões (solicitações) no NGINX – Parte 1
  • Como limitar a taxa de conexões (solicitações) no NGINX – Parte 2
  • Como limitar o uso de largura de banda no NGINX – Parte 3

Lembre-se de que o NGINX considerará uma conexão para limitação somente se houver uma solicitação sendo processada pelo servidor e todo o cabeçalho da solicitação já tiver sido lido. Portanto, nem todas as conexões de clientes são contadas.

Limitando o número de conexões no NGINX

Primeiro, você precisa definir uma zona de memória compartilhada que armazene métricas de conexão para várias chaves, usando a diretiva limit_conn_zone. Conforme mencionado anteriormente, uma chave pode ser um texto, uma variável como o endereço IP remoto de um cliente ou uma combinação dos dois.

Esta diretiva válida no contexto HTTP recebe dois parâmetros: a chave e a zona (no formato nome_da_zona:tamanho).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

Para definir um código de status de resposta que é retornado para solicitações rejeitadas, use a diretiva limit_conn_status que usa um código de status HTTP como parâmetro. É válido nos contextos HTTP, servidor e localização.

limit_conn_status 429;

Para limitar conexões, use a diretiva limint_conn para definir a zona de memória a ser usada e o número máximo de conexões permitidas, conforme mostrado no trecho de configuração a seguir. Esta diretiva é válida nos contextos HTTP, servidor e localização.

limit_conn   limitconnbyaddr  50;

Aqui está a configuração completa:

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;

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

Salve o arquivo e feche-o.

Em seguida, verifique se a configuração do NGINX está correta executando o seguinte comando:

sudo nginx -t

Em seguida, recarregue o serviço NGINX para efetuar as alterações recentes:

sudo systemctl reload nginx

Verificando o limite de conexão Nginx

Quando um cliente excede o número máximo de conexões permitidas, NGINX retorna um erro “429 Too many requests ” para o cliente e registra uma entrada como a abaixo no erro arquivo de log:

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

Limitando o número de conexões do Nginx com o aplicativo

Você também pode limitar o número de conexões para um determinado servidor usando a variável $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 testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/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";
   }
}

Essa configuração permite que o NGINX limite o número total de conexões com o servidor virtual que alimenta o aplicativo testapp.linux-console.net, para 2.000 conexões.

Observação: limitar as conexões com base no IP de um cliente tem uma desvantagem. Você pode acabar restringindo conexões para mais de um usuário, especialmente se muitos usuários que acessam seu aplicativo estiverem na mesma rede e operando atrás de um NAT – todas as suas conexões serão originadas do mesmo endereço IP.

Nesse cenário, você pode empregar uma ou mais variáveis disponíveis no NGINX que podem identificar um cliente no nível do aplicativo. Um exemplo é um cookie de sessão.

Você também pode gostar dos seguintes artigos relacionados ao Nginx:

  • Como criar uma página de erro 404 personalizada no NGINX
  • Como controlar o acesso com base no endereço IP do cliente no NGINX
  • Como armazenar conteúdo em cache no NGINX
  • Como habilitar HTTP/2.0 no Nginx
  • Como usar o Nginx como um balanceador de carga HTTP no Linux

Por enquanto é isso! Na próxima parte desta série, discutiremos outra técnica útil de gerenciamento de tráfego no NGINX – limitando a taxa de solicitações. Até então, fique conosco.