Pesquisa de site

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 no NGINX.

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

Um exemplo de solicitação é uma solicitação GET para a página de login de um aplicativo ou uma solicitação POST em um formulário de login ou um POST. em um endpoint de API.

Há muitos motivos para limitar a taxa de solicitações às suas aplicações web ou serviços de API, sendo um deles a segurança: proteção contra solicitações rápidas abusivas.

Limitando a taxa de conexões no NGINX

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

A diretiva limit_req_zone é válida no contexto HTTP.

limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;

Além disso, defina um código de status de resposta que seja retornado para solicitações rejeitadas, usando a diretiva limit_req_status que é válida nos contextos HTTP, de servidor e de localização.

limit_req_status 429;

Agora você pode usar a diretiva limint_conn para ativar a limitação de taxa de solicitação nos contextos HTTP, de servidor e de localização. Leva uma zona de memória como parâmetro e outros parâmetros opcionais.

limit_req zone=limitreqsbyaddr;

O exemplo de configuração a seguir mostra a limitação da taxa de solicitação para uma API de aplicativo 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 {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;
limit_req_status 429;

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

    #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 {
        limit_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-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

       
   }
}

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

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

sudo nginx -t

Depois disso, recarregue o serviço NGINX e aplique as alterações mais recentes:

sudo systemctl reload nginx

Quando o limite de taxa de 10 solicitações por segundo for excedido por um único cliente acessando /api/, o NGINX retornará uma mensagem “429 Too many requests ” erro para o cliente.

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

2022/04/29 00:30:38 [error] 3145846#0: *131039 limiting requests, excess: 0.990 by zone "limitreqsbyaddr", client: 192.168.1.10, server: testapp.linux-console.net, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.linux-console.net", referrer: "https://testapp.linux-console.net/"

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

Você pode ativar esse comportamento na limitação de taxa usando o parâmetro burst com a diretiva limit_req. Para ativar o enfileiramento sem atraso, adicione o parâmetro nodelay.

limit_req zone=limitreqsbyaddr burst=20 nodelay;

Há um problema com a limitação de taxa com base no IP de um cliente, principalmente para usuários que acessam seu aplicativo na mesma rede e operam atrás de um NAT. Neste caso, todas as suas solicitações serão originadas 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, verifique esta limitação de taxa NGINX no site do NGINX. A seguir, abordaremos como limitar o uso da largura de banda no NGINX.