Volver a la página principal
viernes 8 noviembre 2024
44

Cómo configurar limitación de conexiones y tasa de peticiones en Nginx

Nginx permite configurar la limitación de conexiones y la limitación de tasa de peticiones para controlar la carga en el servidor y proteger la aplicación contra abusos, como ataques de denegación de servicio (DoS). Estas características son esenciales para garantizar un rendimiento óptimo y proteger el servidor de posibles ataques.

¿Qué es la limitación de conexiones y la limitación de tasa de peticiones en Nginx?

  • Limitación de conexiones: Restringe el número de conexiones simultáneas que un cliente puede establecer con el servidor, basado en parámetros como la IP del cliente.
  • Limitación de tasa de peticiones: Controla el número de solicitudes que un cliente puede hacer en un período de tiempo específico, ayudando a evitar sobrecarga.

Configuración básica de limitación de conexiones en Nginx

Para limitar el número de conexiones simultáneas en Nginx, se usa el módulo ngx_http_limit_conn_module, que permite definir un límite de conexiones por clave (por ejemplo, por dirección IP del cliente).

Ejemplo de configuración de limitación de conexiones

1. Definir una zona de limitación de conexiones en el bloque http:

http {
       limit_conn_zone $binary_remote_addr zone=addr_limit:10m;
       
       server {
           listen 80;
           server_name ejemplo.com;

           location / {
               limit_conn addr_limit 10;  # Máximo 10 conexiones simultáneas por IP
               proxy_pass http://backend;
           }
       }
   }

En este ejemplo:

  • limit_conn_zone $binary_remote_addr zone=addr_limit:10m;: Define una zona de 10 MB para almacenar las conexiones activas por dirección IP.
  • limit_conn addr_limit 10;: Permite un máximo de 10 conexiones simultáneas por IP en la ubicación especificada.

Parámetros de limitación de conexiones

Parámetro Descripción
limit_conn_zone Define la variable (clave) y el tamaño de la zona compartida para almacenar el estado de conexión.
limit_conn Establece el límite de conexiones por clave en una ubicación o bloque específico.

Configuración básica de limitación de tasa de peticiones en Nginx

La limitación de tasa de peticiones en Nginx se configura con el módulo ngx_http_limit_req_module, que permite definir la cantidad máxima de solicitudes permitidas en un intervalo de tiempo específico.

Ejemplo de configuración de limitación de tasa de peticiones

1. Definir una zona de limitación de tasa en el bloque http:

http {
       limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
       
       server {
           listen 80;
           server_name ejemplo.com;

           location / {
               limit_req zone=req_limit burst=10 nodelay;  # Máximo de 5 solicitudes por segundo
               proxy_pass http://backend;
           }
       }
   }

En este ejemplo:

  • limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;: Crea una zona de 10 MB para almacenar el estado de cada IP con una tasa máxima de 5 solicitudes por segundo.
  • limit_req zone=req_limit burst=10 nodelay;: Permite una ráfaga de hasta 10 solicitudes en casos de picos de tráfico. nodelay permite procesar las solicitudes de la ráfaga sin espera.

Parámetros de limitación de tasa de peticiones

Parámetro Descripción
limit_req_zone Define la variable y el tamaño de la zona compartida para almacenar el estado de las solicitudes.
rate Tasa de solicitudes permitidas (por ejemplo, 5r/s para 5 solicitudes por segundo).
limit_req Configura el límite de solicitudes y opciones de ráfaga para una ubicación o bloque.
burst Número de solicitudes adicionales permitidas en caso de picos de tráfico (por encima de la tasa).
nodelay Procesa las solicitudes de ráfaga sin tiempos de espera, permitiendo su aceptación inmediata.

Ejemplos adicionales de configuración de limitación

1. Configuración de limitación de conexiones y tasa en una ubicación específica:

server {
       listen 80;
       server_name ejemplo.com;

       location /api/ {
           limit_conn addr_limit 5;             # Máximo 5 conexiones por IP
           limit_req zone=req_limit burst=15;   # Máximo de 5 solicitudes por segundo con 15 solicitudes en ráfaga
           proxy_pass http://backend;
       }
   }

2. Configurar diferentes tasas de solicitud para diferentes ubicaciones:

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

       server {
           listen 80;
           server_name ejemplo.com;

           location /public/ {
               limit_req zone=public_limit burst=5 nodelay;
               proxy_pass http://backend_public;
           }

           location /api/ {
               limit_req zone=api_limit burst=20;
               proxy_pass http://backend_api;
           }
       }
   }

3. Responder con un código personalizado cuando se exceden los límites:

http {
       limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;

       server {
           listen 80;
           server_name ejemplo.com;

           location / {
               limit_req zone=req_limit burst=10;
               limit_req_status 429;  # Responde con el código 429 (Too Many Requests) cuando se excede el límite
               proxy_pass http://backend;
           }
       }
   }

En este ejemplo:

  • limit_req_status 429;: Define el código de respuesta 429 Too Many Requests cuando se excede el límite de solicitudes.

Buenas prácticas para configurar limitación en Nginx

  • Ajustar las tasas y ráfagas según el tráfico: Es importante encontrar un equilibrio que permita manejar el tráfico esperado sin afectar a los usuarios legítimos.
  • Evitar configuraciones demasiado estrictas: Una limitación excesiva puede afectar la experiencia de usuarios legítimos, especialmente en aplicaciones con múltiples solicitudes, como APIs.
  • Monitorear y ajustar: Monitorea el rendimiento y ajusta los límites de acuerdo a los patrones de tráfico y la capacidad del servidor.
  • Logs de errores: Revisa los logs de Nginx para identificar y ajustar las configuraciones en función de posibles errores de limitación.

Referencias

Para más detalles sobre la configuración de limitación de conexiones y tasa de peticiones en Nginx, consulta la documentación oficial de Nginx.

Etiquetas:
nginx
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer