[SOLUCIONADO] Nginx connect() failed (111: Connection refused) while connecting to upstream
Al configurar Nginx como proxy inverso hacia aplicaciones web (Next.js, Express, Django, Laravel), es muy común ver el error HTTP 502 Bad Gateway en el navegador y la siguiente línea en el archivo de registro /var/log/nginx/error.log: connect() failed (111: Connection refused) while connecting to upstream, client: ..., server: ..., request: ..., upstream: "http://127.0.1:3000/...". Esto significa que Nginx intentó transferir la petición al backend, pero no encontró ningún proceso escuchando en ese puerto o socket.
El Diagnóstico Rápido
Solución Rápida (1 Minuto):
- Revisa qué servicios están escuchando en puertos locales:
sudo ss -tulpn | grep -E '3000|8000|8080|9000'- Comprueba si tu backend (Node/Python/Docker) está activo:
sudo systemctl status mi-app
La Solución Paso a Paso
-
1
Paso 1: Comprobar si el backend está escuchando en el puerto correcto
Utiliza
ssonetstatpara verificar si tu servidor backend realmente tiene el puerto abierto:BASHsudo ss -tulpn | grep LISTENSi tu directiva en Nginx es
proxy_pass http://127.0.0.1:3000;pero en la lista de puertos no aparece ningún proceso en el puerto 3000, tu aplicación backend no está corriendo o falló durante el arranque. -
2
Paso 2: Comprobar conflicto entre 127.0.0.1 y localhost (IPv4 vs IPv6)
En sistemas modernos,
localhostpuede resolverse a la dirección IPv6[::1]. Si tu servidor Node.js o Python solo escucha en IPv4 (127.0.0.1), Nginx intentará conectar a IPv6 y arrojará el error 111:NGINX# En tu archivo de configuración de Nginx (/etc/nginx/sites-available/default) location / { # Cambia 'localhost' por la IP explícita 127.0.0.1 proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } -
3
Paso 3: Verificar permisos en sockets UNIX (PHP-FPM o Gunicorn)
Si utilizas sockets UNIX en lugar de puertos TCP (
unix:/run/php/php-fpm.sock), verifica los permisos del archivo socket:BASHls -la /run/php/php-fpm.sockEl socket debe pertenecer al usuario de Nginx (
www-dataen Ubuntu/Debian onginxen RHEL):BASHsudo chown www-data:www-data /run/php/php-fpm.sock sudo chmod 660 /run/php/php-fpm.sock sudo systemctl reload nginx
Preguntas Frecuentes
¿Por qué el error 111 solo ocurre tras reiniciar el servidor?
Ocurre cuando Nginx arranca antes de que el servicio upstream (Node.js o Docker) esté listo. Añade After=docker.service en la unidad de systemd de tu aplicación para controlar el orden de inicio.
¿Cómo distingo entre el error 111 (Connection refused) y el error 110 (Connection timed out)?
El error 111 indica que el puerto rechazó activamente el paquete porque no hay ningún proceso escuchando. El error 110 significa que los paquetes se descartaron silenciosamente (típico de reglas de firewall bloqueando el tráfico).
Consejo de Prevención
Prácticas de seguridad recomendadas:
- Utiliza gestores de procesos como PM2 o unidades de systemd con
Restart=alwayspara que tu backend se recupere automáticamente tras un bloqueo. - Configura health checks periódicos que monitoreen el estado del upstream antes de enviar tráfico.