Nginx · 2 min read · Jan 23, 2026

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 su sitio es atacado por un bot que realiza múltiples solicitudes por segundo y, por lo tanto, aumenta la carga de su servidor. Con el módulo ngx_http_limit_req_module, puede definir un límite de tasa, y si un visitante excede este límite, recibirá un error 503.

1 Usando el HttpLimitReqModule (ngx_http_limit_req_module)

Abra su nginx.conf…

nano /etc/nginx/nginx.conf

… y defina 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 10 MB 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 1 MB, por lo que 10 MB permiten alrededor de 160,000 estados, así que esto debería ser suficiente para sus visitantes. La tasa está limitada a una solicitud por segundo. Tenga en cuenta que debe usar valores enteros aquí, así que si desea establecer el límite a media solicitud por segundo, usaría 30r/m (30 solicitudes por minuto).

Para poner este límite en funcionamiento, usamos la directiva limit_req. Puede usar esta directiva en los contenedores http {}, server {}, y location {}, pero en mi opinión, es más útil en los contenedores location {} que pasan solicitudes a sus servidores de aplicaciones (PHP-FPM, mongrel, etc.) porque, de lo contrario, si carga una sola página con muchas imágenes, CSS y archivos JavaScript, probablemente excederá 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. Puede imaginar el significado de burst como una especie de cola. Significa que si excede el límite de tasa, las solicitudes siguientes se retrasan, y solo si tiene más solicitudes esperando en la cola que las especificadas en el parámetro burst, recibirá un error 503 (por ejemplo, como este:

Límite de tasa de Nginx aplicado.

).

Si no desea usar esta cola (es decir, entregar un 503 inmediatamente si alguien excede el límite de tasa), debe 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 olvide recargar nginx para que sus cambios surtan efecto:

service nginx reload

2 Enlaces

Sobre el Autor

Falko Timme es el propietario de Timme Hosting (alojamiento web nginx ultra-rápido). Es el mantenedor principal de HowtoForge (desde 2005) y uno de los desarrolladores principales de ISPConfig (desde 2000). También ha contribuido al libro de O’Reilly “Administración del Sistema Linux”.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

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