Como limitar a taxa de conexões (solicitações) no nginx

Como limitar a taxa de conexões (solicitações) no nginx

Em nosso último artigo, que faz parte de nossa série de gerenciamento de tráfego NGINX, discutimos como limitar o número de conexões no Nginx. Neste guia, veremos como limitar a taxa de solicitações em Nginx.

A limitação da taxa é uma técnica de gerenciamento de tráfego usada para restringir o número de Http solicitações que um cliente pode fazer em um determinado período de tempo - os limites de taxa são calculados em Pedidos por segundo (ou Rps).

Um exemplo de solicitação é um PEGAR solicitação para a página de login de um aplicativo ou um PUBLICAR solicitar em um formulário de login ou um PUBLICAR em um API endpoint.

Existem muitos motivos para limitar a taxa de solicitações aos seus aplicativos ou serviços de API da Web, sendo um da segurança: protegendo contra solicitações rápidas abusivas.

Taxa limitadora de conexões no nginx

Comece definindo os parâmetros para limitação de taxa usando o limite_req_zone diretivo. Os parâmetros necessários são a chave para a identificação de clientes, uma zona de memória compartilhada que armazenará o estado da chave e com que frequência ele acessou um URL restrito a solicitação e a taxa.

O limite_req_zone A diretiva é válida no contexto HTTP.

limite_req_zone $ binary_remote_addr zone = limitReqsByaddr: 20m Taxa = 10r/s; 

Além disso, defina um código de status de resposta que é retornado para solicitações rejeitadas, usando o limite_req_status Diretiva válida nos contextos HTTP, Sever e Localização.

limite_req_status 429; 

Agora você pode usar o limint_conn Diretiva para ativar a limitação da taxa de solicitação nos contextos HTTP, SERT e Location. É preciso uma zona de memória como um parâmetro e outros parâmetros opcionais.

limite_req zone = limitReqsByaddr; 

O exemplo de configuração a seguir mostra a limitação da taxa de solicitação a uma API de aplicativo da Web. O tamanho da memória compartilhada é de 20 MB e o limite de taxa de solicitação é de 10 solicitações por segundo.

Upstream API_SERVICE servidor 127.0.0.1: 9051; Servidor 10.1.1.77: 9052;  limite_req_zone $ binary_remote_addr zone = limitReqsByaddr: 20m Taxa = 10r/s; limite_req_status 429; servidor ouça 80; server_name testapp.Tecmint.com; root/var/www/html/testapp.Tecmint.com/build; ÍNDICE ÍNDICE.html; #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  limite_req zone = limitReqsByaddr; 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";  

Salve seu arquivo de configuração e feche -o.

Então verifique se o Nginx A sintaxe de configuração está correta usando o seguinte comando:

$ sudo nginx -t 

Depois disso, recarregue o Nginx Serviço Aplique as últimas alterações:

$ sudo systemctl recarregar nginx 

Uma vez que o limite de taxa de 10 As solicitações por segundo é excedida por um único cliente acessando /API/, Nginx retorna um “429 muitos pedidos”Erro para o cliente.

Nginx 429 MUITO ERRO DE PEDIÇÕES

Ele também registra o incidente no log de erros.

2022/04/29 00:30:38 [Erro] 3145846#0: *131039 Limitando solicitações, excesso: 0.990 por zona "limitreqsbyaddr", cliente: 192.168.1.10, servidor: testapp.Tecmint.com, solicitação: "get/api/v1/app/meta-data http/1.1 ", host:" testapp.Tecmint.com ", referenciador:" https: // testapp.Tecmint.com/" 
Logs de erro nginx

Às vezes, dependendo da natureza do seu aplicativo ou API, um cliente precisará fazer muitos pedidos de uma só vez e depois reduzir sua taxa por um período de tempo antes de fazer mais. O NGINX também pode amortecer qualquer excesso de solicitações em uma fila e processá -las prontamente.

Você pode ativar esse comportamento em limitação de taxa usando o explodido parâmetro com o limite_req diretivo. Para ativar a fila sem atraso, adicione o Nodelay parâmetro.

limite_req zone = limitreqsbyaddr burst = 20 nodelay; 

Há um obstáculo com limitação de taxa com base no IP de um cliente, principalmente para usuários que acessam seu aplicativo da mesma rede e operando atrás de um NAT. Nesse caso, todos os seus pedidos serão originários do mesmo endereço IP. Nesse cenário, você pode usar outras variáveis ​​para identificar clientes como um cookie de sessão.

Para obter mais informações sobre como limitar a taxa de solicitações, consulte essa taxa de nginx limitando no site nginx. Em seguida, abordaremos como limitar o uso da largura de banda em Nginx.