Header Ads

Como usar o limite de taxa no Nginx

A limitação de taxa controla quantas solicitações os usuários podem fazer ao seu site. Isso geralmente é implementado para impedir bots abusivos, limitar as tentativas de login e controlar o uso da API, o que pode evitar que o servidor fique lento sob carga.

A limitação de taxa nem sempre evita picos de tráfego massivos, portanto, se o seu servidor realmente precisar de proteção, é uma boa prática configurar um CDN de site completo antecipadamente ou, pelo menos, configurar o carregamento HAProxy balanceamento para dividir a carga em vários servidores.

Como ativar o limite de taxa no Nginx

Primeiro, devemos definir uma zona de limitação de taxa “. ” Você pode ter várias zonas configuradas e atribuir blocos de locais diferentes para cada zona. Por enquanto, vamos criar uma zona básica adicionando a seguinte linha ao seu servidor ou bloco de contexto http:

 limit_req_zone $ binary_remote_addr zone = foo: 10m rate = 5r / s; 

O comando limit_req_zone define uma zona usando $ binar_remote_addr como identificador. Este é o endereço IP do cliente, mas você também pode usar algo como $ server_name para limitá-lo por servidor.

O sinalizador de zona nomeia a zona (neste caso, “ foo ”) e aloca um bloco de memória para a zona. O Nginx precisa armazenar endereços IP para verificação, portanto, precisa de memória para cada zona. Nesse caso, 10m aloca 10 megabytes de memória, o suficiente para 160.000 conexões por segundo (que você provavelmente nunca verá em um único servidor).

O sinalizador final é a taxa, que define o número padrão de conexões que cada cliente é permitido. Aqui, ele é definido para 5 solicitações por segundo, com 10 sendo o máximo, embora você possa defini-lo mais lentamente, formatando-o como 30 r / m (para 30 solicitações por minuto).

Assim que a zona estiver configurada, é hora de fazer uso dela.

 localização {limit_req zone = foo burst = 10 nodelay; // fazer coisas do servidor web} 

A diretiva limit_req faz o trabalho pesado e atribui um bloco de localização a uma zona de limitação. O parâmetro burst dá ao cliente alguma margem de manobra e permite que ele faça solicitações extras, desde que não ultrapasse a taxa média.

Nos bastidores, ele adiciona solicitações de burst a uma “ fila ” que diminui a cada 100 ms. Isso pode fazer com que seu site pareça lento, portanto, o parâmetro nodelay remove esse atraso de fila. Com a configuração atual, se você fez 10 solicitações ao mesmo tempo, o parâmetro nodelay permitiria todas as 10 solicitações e, em seguida, limitaria a taxa das solicitações a seguir em 5 solicitações por segundo. Se você fez mais 6 solicitações, permitiria 5 e rejeitaria a 6, pois está acima do limite. Assim que o cliente para de fazer solicitações, a fila diminui em uma velocidade que depende da sua taxa.

Limite de taxa de dois estágios

Ao definir manualmente a variável de atraso, é possível permitir que alguns pedidos não tenham atraso enquanto o resto tem que esperar na fila. Isso forma um limite de taxa de dois estágios, em que você deseja que as solicitações iniciais sejam muito rápidas, as solicitações de acompanhamento sejam um pouco mais lentas e, em seguida, expanda o limite de taxa.

Isso é feito atribuindo um valor de atraso na diretiva limit_req:

 limit_req zone = ip burst = 10 delay = 5; 

Aqui, as primeiras 5 solicitações chegarão instantaneamente. O cliente pode então receber mais 5 solicitações a cada 100 ms até que o burst seja preenchido, após o que, eles são limitados pela variável de taxa.

Taxa de largura de banda de limitação

Limitar as solicitações bloqueará a maioria dos ataques mal-intencionados, mas você pode querer limitar a velocidade de download para que os usuários não deixem seu servidor lento baixando muitos arquivos.

Você pode fazer isso com a diretiva limit_rate, que não precisa de uma zona de limitação configurada para ela.

 limit_rate 100k limit_rate_após 1m 

Isso define a velocidade máxima de download para 100 Kbps após o download de 1 megabyte. No entanto, isso é medido por conexão e os usuários podem abrir várias conexões. Para resolver isso, você precisará adicionar uma zona de limitação de conexão ao lado da zona de limitação de solicitação:

 limit_conn_zone $ binary_remote_address zona = bar: 10m limit_req_zone $ binary_remote_addr zona = foo: 10m taxa = 5r / s; 

Isso cria uma zona de 10 megabytes chamada “ bar ” que rastreia com base no endereço IP. Você pode usar isso junto com uma diretiva limit_conn para habilitar a limitação de conexão.

 servidor {limit_conn bar 5; localização / estático / {limit_conn bar 1; limit_rate 100k; limit_rate_after 1m; }} 

Como a maioria dos navegadores abre várias conexões durante a navegação normal, queremos definir o limite de conexão global mais alto e, em seguida, definir o limite para 1 conexão para download.

Nenhum comentário