Limit Req#

O módulo é usado para limitar a taxa de processamento de requisições por uma chave definida, em particular, a taxa de processamento de requisições vindas de um único endereço IP. A limitação é feita usando o método "leaky bucket".

Exemplo de Configuração#

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...

        location /search/ {
            limit_req zone=one burst=5;
        }

Diretivas#

limit_req#

Sintaxe

limit_req zone=name [burst=number] [nodelay | delay=number];

Padrão

Contexto

http, server, location

Define a zona de memória compartilhada e o tamanho máximo de rajada de requisições. Se a taxa de requisições exceder a taxa configurada para uma zona, seu processamento é atrasado de forma que as requisições sejam processadas a uma taxa definida. Requisições excessivas são atrasadas até que seu número exceda o tamanho máximo de rajada, caso em que a requisição é terminada com um erro. Por padrão, o tamanho máximo de rajada é igual a zero. Por exemplo, as diretivas

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5;
    }

permitem não mais que 1 requisição por segundo em média, com rajadas não excedendo 5 requisições.

Se o atraso de requisições excessivas enquanto as requisições estão sendo limitadas não for desejado, o parâmetro nodelay deve ser usado:

limit_req zone=one burst=5 nodelay;

O parâmetro delay especifica um limite no qual requisições excessivas passam a ser atrasadas. O valor padrão é zero, ou seja, todas as requisições excessivas são atrasadas.

Pode haver várias diretivas limit_req. Por exemplo, a seguinte configuração limitará a taxa de processamento de requisições vindas de um único endereço IP e, ao mesmo tempo, a taxa de processamento de requisições pelo servidor virtual:

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=10;
}

Essas diretivas são herdadas do nível de configuração anterior se e somente se não houver diretivas limit_req definidas no nível atual.

limit_req_dry_run#

Sintaxe

limit_req_dry_run on | off;

Padrão

limit_req_dry_run off;

Contexto

http, server, location

Habilita o modo de execução a seco. Neste modo, a taxa de processamento de requisições não é limitada, porém, na zona de memória compartilhada, o número de requisições excessivas é contabilizado normalmente.

limit_req_log_level#

Sintaxe

limit_req_log_level info | notice | warn | error;

Padrão

limit_req_log_level error;

Contexto

http, server, location

Define o nível de log desejado para casos quando o servidor se recusa a processar requisições devido ao excesso de taxa, ou atrasa o processamento de requisições. O nível de log para atrasos é um ponto menor que para recusas; por exemplo, se limit_req_log_level notice for especificado, atrasos são registrados com o nível info.

limit_req_status#

Sintaxe

limit_req_status code;

Padrão

limit_req_status 503;

Contexto

http, server, location

Define o código de status a ser retornado em resposta a requisições rejeitadas.

limit_req_zone#

Sintaxe

limit_req_zone key zone=name:size rate=rate;

Padrão

Contexto

http

Define parâmetros para uma zona de memória compartilhada que manterá estados para várias chaves. Em particular, o estado armazena o número atual de requisições excessivas. A chave pode conter texto, variáveis e sua combinação. Requisições com valor de chave vazio não são contabilizadas.

Exemplo de uso:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

Aqui, os estados são mantidos em uma zona de 10 megabytes one, e uma taxa média de processamento de requisições para esta zona não pode exceder 1 requisição por segundo.

Um endereço IP do cliente serve como chave. Note que ao invés de $remote_addr, a variável $binary_remote_addr é usada aqui.

O tamanho da variável $binary_remote_addr é sempre 4 bytes para endereços IPv4 ou 16 bytes para endereços IPv6. O estado armazenado sempre ocupa 64 bytes em plataformas de 32 bits e 128 bytes em plataformas de 64 bits.

Uma zona de um megabyte pode manter cerca de 16 mil estados de 64 bytes ou cerca de 8 mil estados de 128 bytes.

Se o armazenamento da zona for esgotado, o estado usado menos recentemente é removido. Se mesmo após isso um novo estado não puder ser criado, a requisição é terminada com um erro.

A rate é especificada em requisições por segundo (r/s). Se uma taxa de menos de uma requisição por segundo for desejada, ela é especificada em requisições por minuto (r/m). Por exemplo, meia requisição por segundo é 30r/m.

Variáveis Integradas#

$limit_req_status#

mantém o resultado da limitação da taxa de processamento de requisições: PASSED, DELAYED, REJECTED, DELAYED_DRY_RUN, ou REJECTED_DRY_RUN