Limit Req#

El módulo se utiliza para limitar la velocidad de procesamiento de solicitudes por una clave definida, en particular, la velocidad de procesamiento de solicitudes provenientes de una sola dirección IP. La limitación se realiza utilizando el método de “cubo con fugas” (leaky bucket).

Ejemplo de configuración#

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

    ...

    server {

        ...

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

Directivas#

limit_req#

Sintaxis

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

Predeterminado

Contexto

http, server, location

Establece la zona de memoria compartida y el tamaño máximo de ráfaga de solicitudes. Si la velocidad de solicitudes excede la configurada para una zona, su procesamiento se retrasa de manera que las solicitudes se procesan a una velocidad definida. Las solicitudes excesivas se retrasan hasta que su número supera el tamaño máximo de ráfaga, en cuyo caso la solicitud se termina con un error. Por defecto, el tamaño máximo de ráfaga es igual a cero. Por ejemplo, las directivas

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

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

permiten no más de 1 solicitud por segundo en promedio, con ráfagas que no superen 5 solicitudes.

Si no se desea retrasar las solicitudes excesivas mientras se está limitando, debe usarse el parámetro nodelay:

limit_req zone=one burst=5 nodelay;

El parámetro delay especifica un límite a partir del cual las solicitudes excesivas se retrasan. El valor por defecto es cero, es decir, todas las solicitudes excesivas se retrasan.

Pueden existir varias directivas limit_req. Por ejemplo, la siguiente configuración limitará la velocidad de procesamiento de solicitudes provenientes de una sola dirección IP y, al mismo tiempo, la velocidad de procesamiento de solicitudes por 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;
}

Estas directivas se heredan del nivel de configuración anterior solamente si no hay directivas limit_req definidas en el nivel actual.

limit_req_dry_run#

Sintaxis

limit_req_dry_run on | off;

Predeterminado

limit_req_dry_run off;

Contexto

http, server, location

Activa el modo de simulación (dry run). En este modo, la velocidad de procesamiento de solicitudes no se limita, sin embargo, en la zona de memoria compartida el número de solicitudes excesivas se contabiliza como de costumbre.

limit_req_log_level#

Sintaxis

limit_req_log_level info | notice | warn | error;

Predeterminado

limit_req_log_level error;

Contexto

http, server, location

Configura el nivel de registro deseado para los casos en que el servidor se niega a procesar solicitudes por exceso de velocidad, o retrasa su procesamiento. El nivel de registro para retrasos es un punto menor que para rechazos; por ejemplo, si se especifica limit_req_log_level notice, los retrasos se registran con nivel info.

limit_req_status#

Sintaxis

limit_req_status code;

Predeterminado

limit_req_status 503;

Contexto

http, server, location

Configura el código de estado a devolver en respuesta a las solicitudes rechazadas.

limit_req_zone#

Sintaxis

limit_req_zone key zone=name:size rate=rate;

Predeterminado

Contexto

http

Configura parámetros para una zona de memoria compartida que mantendrá los estados para varias claves. En particular, el estado almacena el número actual de solicitudes excesivas. La clave puede contener texto, variables y su combinación. Las solicitudes con un valor de clave vacío no se contabilizan.

Ejemplo de uso:

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

Aquí, los estados se mantienen en una zona de 10 megabytes one, y la velocidad promedio de procesamiento de solicitudes para esta zona no puede superar 1 solicitud por segundo.

Una dirección IP del cliente sirve como clave. Nótese que, en lugar de $remote_addr, aquí se utiliza la variable $binary_remote_addr.

El tamaño de la variable $binary_remote_addr es siempre de 4 bytes para direcciones IPv4 o 16 bytes para direcciones IPv6. El estado almacenado siempre ocupa 64 bytes en plataformas de 32 bits y 128 bytes en plataformas de 64 bits.

Una zona de un megabyte puede mantener alrededor de 16 mil estados de 64 bytes o unos 8 mil estados de 128 bytes.

Si se agota el almacenamiento de la zona, se elimina el estado menos utilizado recientemente. Si incluso después de eso no se puede crear un nuevo estado, la solicitud se termina con un error.

El rate se especifica en solicitudes por segundo (r/s). Si se desea una velocidad inferior a una solicitud por segundo, se especifica en solicitudes por minuto (r/m). Por ejemplo, media solicitud por segundo es 30r/m.

Variables integradas#

$limit_req_status#

guarda el resultado de la limitación de la velocidad de procesamiento de solicitudes: PASSED, DELAYED, REJECTED, DELAYED_DRY_RUN o REJECTED_DRY_RUN