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

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

Nginx Navios com vários módulos para permitir que os usuários controlem o tráfego para 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 Dos (Negação de serviço) ataques.

Existem três maneiras principais de limitar o uso ou tráfego em Nginx:

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

O de cima Nginx As abordagens de gerenciamento de tráfego, dependendo do caso de uso, podem ser configuradas para limitar com base em uma chave definida, sendo o mais comum o endereço IP de um cliente. Nginx também suporta outras variáveis, como um 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 em 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 da largura de banda no Nginx - Parte 3

Tenha em mente que Nginx considerará uma conexão para limitar apenas se tiver uma solicitação sendo processada pelo servidor e todo o cabeçalho da solicitação já foi lido. Portanto, nem todas as conexões do cliente são contadas.

Número limitador de conexões no nginx

Primeiro, você precisa definir uma zona de memória compartilhada que armazena métricas de conexão para várias chaves, usando o limite_conn_zone diretivo. Como 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 dentro do contexto HTTP leva dois parâmetros: o chave e a zona (No formato zone_name: tamanho).

limite_conn_zone $ binary_remote_addr zone = limitConnByaddr: 20m; 

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

limite_conn_status 429; 

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

limite_conn limiteconnbyaddr 50; 

Aqui está a configuração completa:

Upstream API_SERVICE servidor 127.0.0.1: 9051; Servidor 10.1.1.77: 9052;  limite_conn_zone $ binary_remote_addr zone = limitConnByaddr: 20m; limite_conn_status 429; servidor ouça 80; server_name testapp.Tecmint.com; root/var/www/html/testapp.Tecmint.com/build; ÍNDICE ÍNDICE.html; limite_conn limiteconnbyaddr 50; #include snippets/error_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; Localização / Try_files $ URI $ URI / / ÍNDICE.html = 404 = 403 = 500;  localização/api proxy_pass http: // api_service; proxy_set_header x-real-ip $ remote_addr; proxy_set_header host $ host; proxy_set_header x forwarded para $ proxy_add_x_forwarded_for; proxy_http_version 1.1; Atualização proxy_set_header $ http_upgrade; Proxy_set_header Connection "Upgrade";  
Limite as conexões nginx

Salve o arquivo e feche-o.

Então verifique se o Nginx A configuração está bem executando o seguinte comando:

$ sudo nginx -t 

Em seguida, recarregue o Nginx Serviço para efetuar as mudanças recentes:

$ sudo systemctl recarregar nginx 

Verificando o limite de conexão nginx

Quando um cliente excede o número máximo de conexões permitidas, Nginx Retorna um “429 muitos pedidos”Erro ao cliente e registra uma entrada como a abaixo no arquivo de log de erros:

2022/03/15 00:14:00 [Erro] 597443#0: *127 Limitando conexões por zona "limitConnByaddr", cliente: x.x.x.x, servidor: testapp.Tecmimt.com, solicitação: "get/static/css/main.63fdefff.pedaço.CSS.mapa http/1.1 ", host:" testapp.Tecmimt.com " 
Nginx Conexão Limite de erro

Limitando o número Nginx de conexões à aplicação

Você também pode limitar o número de conexões para um determinado servidor é usando o $ server_name variável:

Upstream API_SERVICE servidor 127.0.0.1: 9051; Servidor 10.1.1.77: 9052;  limite_conn_zone $ server_name zone = limitebyServers: 10m; limite_conn_status 429; servidor ouça 80; server_name testapp.Tecmint.com; root/var/www/html/testapp.Tecmint.com/build; ÍNDICE ÍNDICE.html; limite_conn limitebyservers 2000; #include snippets/error_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; Localização / Try_files $ URI $ URI / / ÍNDICE.html = 404 = 403 = 500;  localização/api proxy_pass http: // api_service; proxy_set_header x-real-ip $ remote_addr; proxy_set_header host $ host; proxy_set_header x forwarded para $ proxy_add_x_forwarded_for; proxy_http_version 1.1; Atualização proxy_set_header $ http_upgrade; Proxy_set_header Connection "Upgrade";  

Esta configuração permite Nginx Para limitar o número total de conexões com o servidor virtual alimentando o aplicativo testApp.Tecmint.com, para 2000 conexões.

Observação: Limitar conexões com base no IP de um cliente tem uma desvantagem. Você pode acabar restringindo conexões para mais do que apenas 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 originárias 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 página de erro 404 personalizada no Nginx
  • Como controlar o acesso com base no endereço IP do cliente no nginx
  • Como cache o conteúdo do nginx
  • Como ativar HTTP/2.0 em nginx
  • Como usar o nginx como um balanceador de carga HTTP no Linux

É isso por agora! Na próxima parte desta série, discutiremos outra técnica útil de gerenciamento de tráfego em Nginx - limitando a taxa de solicitações. Até então, fique conosco.