Nginx · 2 min read · Oct 11, 2025

Limitación de Tasa con Nginx

Este artículo explica cómo usar el módulo HttpLimitReqModule de nginx para limitar el número de solicitudes para una sesión dada. Esto es útil, por ejemplo, si tu sitio es atacado por un bot que realiza múltiples solicitudes por segundo y, por lo tanto, aumenta la carga de tu servidor. Con el HttpLimitReqModule puedes definir un límite de tasa, y si un visitante excede este límite, recibirá un error 503.

1 Usando El HttpLimitReqModule

Abre tu nginx.conf…

nano /etc/nginx/nginx.conf

… y define un área donde se almacenan los estados de sesión; esto debe ir dentro del contenedor http {}:

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

Esta área se llama one y se le asignan 10MB de almacenamiento. En lugar de la variable $remote_addr, usamos la variable $binary_remote_addr que reduce el tamaño del estado a 64 bytes. Puede haber alrededor de 16,000 estados en una zona de 1MB, por lo que 10MB permite alrededor de 160,000 estados, así que esto debería ser suficiente para tus visitantes. La tasa está limitada a una solicitud por segundo. Ten en cuenta que debes usar valores enteros aquí, así que si deseas establecer el límite a media solicitud por segundo, usarías 30r/m (30 solicitudes por minuto).

Para poner este límite en funcionamiento, usamos la directiva limit_req. Puedes usar esta directiva en contenedores http {}, server {}, y location {}, pero en mi opinión, es más útil en contenedores location {} que pasan solicitudes a tus servidores de aplicaciones (PHP-FPM, mongrel, etc.) porque de lo contrario, si cargas una sola página con muchas imágenes, CSS y archivos JavaScript, probablemente excederías el límite de tasa dado con una sola solicitud de página.

Así que pongamos esto en un contenedor location ~ .php$ {}:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5;
        }
[...]

limit_req zone=one burst=5; especifica que este límite de tasa pertenece al área de almacenamiento de sesión que definimos antes (debido a zone=one), lo que significa que el límite de tasa es 1r/s. Puedes imaginar el significado de la opción burst como una especie de cola. Significa que si excede el límite de tasa, las solicitudes siguientes se retrasan, y solo si tienes más solicitudes esperando en la cola que las especificadas en el parámetro burst, recibirás un error 503 (por ejemplo, como este:

Límite de tasa de Nginx aplicado

).

Si no deseas usar esta cola (es decir, entregar un 503 inmediatamente si alguien excede el límite de tasa), debes usar la opción nodelay:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5 nodelay;
        }
[...]

No olvides recargar nginx para que tus cambios surtan efecto:

systemctl nginx reload

2 Enlaces

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.