Nginx

bind() to 0.0.0.0:80 failed (98: Address already in use)

El servicio no llega a levantar. Otro proceso —o el propio Nginx que no terminó de pararse— ya tiene el puerto.

Lo primero es saber quién lo tiene. Reiniciar a ciegas suele dejar el puerto ocupado por lo mismo.

Qué comprobar, y en qué orden

En el orden en que lo miramos nosotros. No es un ranking de frecuencia: no publicamos estadísticas que no hemos medido.

  1. 1

    Hay otro servidor web escuchando, normalmente Apache instalado por dependencias.

    Comprobar

    sudo ss -tlnp | grep -E ':80|:443'

    Corregir

    sudo systemctl disable --now apache2
  2. 2

    Quedan procesos de Nginx de un arranque anterior que no murieron.

    Comprobar

    ps aux | grep '[n]ginx'

    Corregir

    sudo systemctl stop nginx
    # -x compara el nombre del proceso, no la línea de órdenes entera: con -f
    # se llevaría por delante cualquier comando que mencione nginx, empezando
    # por el tail que tengas mirando su log.
    sudo pkill -x nginx
    sudo systemctl start nginx
  3. 3

    Dos server distintos declaran el mismo listen con parámetros incompatibles —default_server o reuseport repetidos—, normalmente por un fichero duplicado en sites-enabled. Varios server pueden compartir puerto, pero esos parámetros van una sola vez.

    Comprobar

    sudo nginx -t
    sudo nginx -T | grep -E '^\s*listen ' | sort | uniq -d

    Corregir

    # Dejar default_server (y reuseport, si se usa) en un único server por
    # puerto; los demás mantienen su listen y se distinguen por server_name.

Los comandos de esta página se ejecutan en tu servidor y algunos modifican la configuración: léelos antes de pegarlos. Las rutas y los nombres de servicio varían entre distribuciones. Así se elabora este catálogo.