Icono del sitio Binario 0

Cómo solucionar el error de Nginx, worker_connections exceed open file resource limit: 1024

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

En entornos de alta concurrencia, Nginx puede mostrar advertencias como:

[warn] 32768 worker_connections exceed open file resource limit: 1024

Este mensaje indica que la configuración de worker_connections en nginx.conf supera el límite de descriptores de archivo (open files) permitido por el sistema para el proceso de Nginx.

Cada conexión de cliente consume al menos un descriptor de archivo. Si Nginx intenta aceptar más de los permitidos por el sistema, puede provocar errores de conexión o advertencias.

Causas del error

  1. worker_connections demasiado alto
    En nginx.conf se configuró un número elevado de conexiones simultáneas. Ejemplo problemático: events { worker_connections 32768; }
  2. Límite de archivos abiertos bajo en el sistema (ulimit -n)
    Por defecto, muchos sistemas Linux establecen un límite de solo 1024 descriptores de archivo por proceso.
  3. worker_rlimit_nofile no configurado
    Sin esta directiva, Nginx no puede pedir al kernel aumentar el límite de open files para cada worker.

Solución paso a paso

1. Ajustar worker_rlimit_nofile en Nginx

Edita /etc/nginx/nginx.conf y añade la directiva en el bloque principal:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log warn;
include /etc/nginx/modules-enabled/*.conf;

# Elevar límite de descriptores de archivo por worker
worker_rlimit_nofile 131072;

events {
    worker_connections 32768;
    multi_accept on;
}

http {
    # resto de tu configuración...
}

Nota: worker_rlimit_nofile debe ser ≥ (worker_connections × worker_processes), con un margen adicional.

2. Configurar límites en systemd

Nginx se ejecuta como servicio, y ulimit de la shell no basta. Crea un override para levantar el límite:

sudo mkdir -p /etc/systemd/system/nginx.service.d
sudo tee /etc/systemd/system/nginx.service.d/override.conf >/dev/null <<'EOF'
[Service]
LimitNOFILE=200000
EOF

Recarga systemd y reinicia Nginx:

sudo systemctl daemon-reload
sudo systemctl restart nginx

3. Verificar límites aplicados

Ejecuta:

# Ver límite de open files en proceso maestro de Nginx
cat /proc/$(pgrep -o nginx)/limits | grep "open files"

Salida esperada:

Max open files            200000                200000                files

También puedes validar la sintaxis de Nginx:

nginx -t

4. Ajustar configuración según recursos

En tu servidor (2 vCPU, 2 GB RAM), poner worker_connections 32768 puede ser excesivo.
Recomendación realista:

events {
    worker_connections 8192;
    multi_accept on;
}
worker_rlimit_nofile 65536;

Esto permite manejar unas 16.000 conexiones simultáneas (2 workers × 8192), mucho más acorde a tu hardware, evitando consumo excesivo de memoria.

Conclusión

El error:

worker_connections exceed open file resource limit: 1024

aparece porque Nginx intenta manejar más conexiones de las que el sistema permite.

La solución pasa por:

  1. Añadir worker_rlimit_nofile en nginx.conf.
  2. Elevar LimitNOFILE en systemd.
  3. Ajustar worker_connections a valores realistas para tu hardware.

Con estos cambios, Nginx podrá manejar conexiones concurrentes sin limitaciones artificiales impuestas por el sistema.

Salir de la versión móvil