• Configuración de ejemplo
  • Directivas
  • limit_req
  • limit_req_dry_run
  • limit_req_log_level
  • limit_req_status
  • limit_req_zone
  • Variables incrustadas

los ngx_http_limit_req_module El módulo (0.7.21) se usa para limitar la tasa de procesamiento de solicitudes por una clave definida, en particular, la tasa de procesamiento de solicitudes provenientes de una única dirección IP. La limitación se realiza mediante el método de “cubeta con fugas”.

Configuración de ejemplo

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

    ...

    server {

        ...

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

Directivas

Sintaxis: limit_req
zone=name
[burst=number]
[nodelay |
delay=number];
Defecto:
Contexto: http, server, location

Establece la zona de memoria compartida y el tamaño máximo de ráfaga de solicitudes. Si la tasa de solicitudes excede la tasa configurada para una zona, su procesamiento se retrasa de tal manera que las solicitudes se procesan a una tasa definida. Las solicitudes excesivas se retrasan hasta que su número excede el tamaño máximo de ráfaga, en cuyo caso la solicitud finaliza con un error. De forma predeterminada, 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;
    }

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

Si no se desea retrasar las solicitudes excesivas mientras se limitan las solicitudes, el parámetro nodelay debería ser usado:

limit_req zone=one burst=5 nodelay;

los delay El parámetro (1.15.7) especifica un límite en el que se retrasan las solicitudes excesivas. El valor predeterminado es cero, es decir, todas las solicitudes excesivas se retrasan.

Podría haber varios limit_req directivas. Por ejemplo, la siguiente configuración limitará la tasa de procesamiento de solicitudes provenientes de una única dirección IP y, al mismo tiempo, la tasa de procesamiento de solicitudes por parte del 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 si y solo si no hay limit_req directivas definidas en el nivel actual.

Sintaxis: limit_req_dry_run on | off;
Defecto: limit_req_dry_run off;
Contexto: http, server, location

Esta directiva apareció en la versión 1.17.1.

Habilita el modo de funcionamiento en seco. En este modo, la tasa de procesamiento de solicitudes no está limitada; sin embargo, en la zona de memoria compartida, el número de solicitudes excesivas se contabiliza como de costumbre.

Sintaxis: limit_req_log_level
info |
notice |
warn |
error;
Defecto: limit_req_log_level error;
Contexto: http, server, location

Esta directiva apareció en la versión 0.8.18.

Establece el nivel de registro deseado para los casos en los que el servidor se niega a procesar solicitudes debido a que la tasa se excede o retrasa el procesamiento de solicitudes. El nivel de registro para retrasos es un punto menos que para rechazos; por ejemplo, si “limit_req_log_level notice“Se especifica, los retrasos se registran con el info nivel.

Sintaxis: limit_req_status code;
Defecto: limit_req_status 503;
Contexto: http, server, location

Esta directiva apareció en la versión 1.3.15.

Establece el código de estado que se devolverá en respuesta a solicitudes rechazadas.

Sintaxis: limit_req_zone
key
zone=name:size
rate=rate
[sync];
Defecto:
Contexto: http

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

Antes de la versión 1.7.6, un key podría contener exactamente una variable.

Ejemplo de uso:

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

Aquí, los estados se mantienen en una zona “uno” de 10 megabytes, y una tasa de procesamiento de solicitudes promedio para esta zona no puede exceder 1 solicitud por segundo.

La dirección IP de un cliente sirve como clave. Tenga en cuenta que en lugar de $remote_addr, los $binary_remote_addr La variable se usa aquí. los $binary_remote_addr El tamaño de la variable es siempre de 4 bytes para direcciones IPv4 o de 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 megabyte puede mantener alrededor de 16 mil estados de 64 bytes o alrededor de 8 mil estados de 128 bytes.

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

La tasa se especifica en solicitudes por segundo (r / s). Si se desea una tasa de menos de una solicitud por segundo, se especifica en solicitud por minuto (r / m). Por ejemplo, la mitad de la solicitud por segundo es 30r / m.

los sync El parámetro (1.15.3) habilita la sincronización de la zona de memoria compartida.

los sync El parámetro está disponible como parte de nuestro suscripción comercial.

Además, como parte de nuestra suscripción comercial, la información de estado para cada zona de memoria compartida se puede obtener o restablecer con la API desde 1.17.7.

Variables incrustadas

$limit_req_status
mantiene el resultado de limitar la tasa de procesamiento de solicitudes (1.17.6): PASSED, DELAYED, REJECTED, DELAYED_DRY_RUN, o REJECTED_DRY_RUN