nginx - nginx: [emerg] bind () a [::]: 80 falló (98: dirección ya en uso)

248

De repente recibo el siguiente error nginx

 * Restarting nginx
 * Stopping nginx nginx
   ...done.
 * Starting nginx nginx
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
   ...done.
   ...done.

Si corro

lsof -i :80 or sudo fuser -k 80/tcp 

No consigo nada Nada en el puerto 80

Luego ejecuto el siguiente:

sudo netstat -pan | grep ":80"
tcp        0      0 127.0.0.1:8070          0.0.0.0:*               LISTEN      15056/uwsgi     
tcp        0      0 10.170.35.97:39567      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39564      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39584      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39566      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39571      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39580      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39562      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39582      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39586      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39575      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39579      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39560      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39587      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39591      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39589      10.158.58.13:8080       TIME_WAIT   - 

Estoy perplejo ¿Cómo depuro esto?

Estoy usando uwsgi con un pase de proxy en el puerto 8070. uwsgi se está ejecutando. Nginx no lo es. Estoy usando ubuntu 12.4

A continuación se muestran las partes relevantes de mi archivo nginx conf

upstream uwsgi_frontend {
          server 127.0.0.1:8070;
        }
server {
listen 80;
        server_name 127.0.0.1;
        location = /favicon.ico {
                  log_not_found off;
                }



                location / {
                       include uwsgi_params;
                       uwsgi_buffering off;

                       uwsgi_pass 127.0.0.1:8070;
                 }
        }

Así es como instalo nginx en ubuntu 12.04

nginx=stable;add-apt-repository ppa:nginx/$nginx;
apt-get update
apt get install nginx-full
Tampa
fuente
19
Encontré el problema que nunca tuve antes. Tuve que eliminar / etc / nginx / sites-available / default. Entonces funcionó. Mi conf estaba en / etc / nginx / default
Tampa
Estaba ejecutando Nginx + Varnish y tuve este error. La solución fue detener ambas, luego comenzar nginx primero y luego barnizar.
Ben
puede intentar detener el servicio con nombre.
amal
¿había eliminado su valor predeterminado de los sitios habilitados?
Wolfpack'08
Intenté todas las soluciones aquí. Verifiqué todos los puertos en uso (lo estaba utilizando NGINX), así que eliminé el puerto y lo reinicié. Trabajado como un encanto.
Gavin

Respuestas:

202

[::]:80 es una dirección ipv6.

Este error puede ser causado si tiene una configuración nginx que está escuchando en el puerto 80 y también en el puerto [::]:80.

Tenía lo siguiente en mi archivo predeterminado de sitios disponibles:

listen 80;
listen [::]:80 default_server;

Puede solucionar esto agregando ipv6only=ona [::]:80esto:

listen 80;
listen [::]:80 ipv6only=on default_server;

Para más información, ver:

http://forum.linode.com/viewtopic.php?t=8580

http://wiki.nginx.org/HttpCoreModule#listen

Nathan
fuente
11
También puede solucionarlo simplemente quitando el listen 80; porque escuchar [::]: 80 oyentes a IPv4 e IPv6. Sin embargo, tenga cuidado porque algunos sistemas (como FreeBSD) separan los sockets IPv4 e IPv6 y luego no funcionará, pero para Linux debería estar bien. wiki.nginx.org/HttpCoreModule#listen
gitaarik
44
Gracias por profundizar en esto y proporcionar una explicación de por qué eliminar /etc/nginx/sites-available/defaultayuda con el error anterior.
Oliver
1
Incluso cuando comento la línea ipv6, sigo teniendo el mismo error cuando lo intento sudo service nginx restart. Cuando lo hago netstat -tulpn |grep 80, obtengo solo una vez el proceso nginx (0.0.0.0:80). ¿Alguna idea de por qué no se reiniciará?
Romano
Respaldo lo que dijo @rednaw, pero en lugar de eliminar la escucha, simplemente puede comentarlo
d4nyll
La configuración ipv6only=onsolucionó el problema, pero nginx realmente debería detectar que está intentando vincularse a la misma interfaz: puerto dos veces.
Dan Dascalescu
246

Lo solucioné ejecutando sudo apachectl stop: resulta que Apache se estaba ejecutando en segundo plano e impidió que nginx se iniciara en el puerto deseado.

En ubuntu ejecutar sudo /etc/init.d/apache2 stop

lfender6445
fuente
8
Use sudo /etc/init.d/apache2 stoppara detener apache en Ubuntu 14.04
Footniko
3
La razón es porque no puede tener dos servidores web escuchando el mismo puerto. Elija uno y, si es necesario, proxy. Por ejemplo, use nginx, pero para ciertas solicitudes (como para phparchivos), proxy al puerto Apache.
d4nyll
Lo mismo aquí en una nueva instalación de Debian 9.
jirarium
Gracias. ¿Pero alguna idea de por qué comenzó de repente? No toqué el servidor durante una semana, pero había comenzado anoche.
Ajay Singh
1
Gracias por tu solución. Funciona para mí, uso Google Cloud Platform
congle
93

Mi caso es diferente, tuve que matar ejecutando Nginx para reiniciarlo.

En vez de

sudo systemctl restart nginx

Tuve que usar:

sudo pkill -f nginx & wait $!
sudo systemctl start nginx
datdinhquoc
fuente
1
Estaba tomando 404 Not Found, y usé su sugerencia, ahora solucioné mi problema. Gracias.
Bahía
3
Esto funcionó para mí. Nada más lo hizo. No estoy seguro de qué proceso comienza cuando el sistema se reinicia, pero lo agregaré en mi rutina de reinicio nginx. ¡Gracias!
Khom Nazid
38

Encontré el problema que nunca tuve antes.

Solo tuve que eliminar /etc/nginx/sites-available/default. Entonces funcionó.

Mi conf estaba en /etc/nginx/default.

Tampa
fuente
2
+1 Esta solución funcionó para mí, pero luego pensé que debe haber algo predeterminado que realmente está causando el problema, así que busqué un poco más y proporcioné una respuesta con más información.
Nathan
11
Yo diría que eliminar la plantilla de configuración del sitio predeterminada no es la mejor solución: comentar la línea que contiene listen 80;esa misma plantilla ya resuelve el problema y lo hace correctamente. Tu truco funciona, pero no es lo que quisiera que hagan los futuros lectores de tu pregunta. Es por eso que le sugiero que seleccione la respuesta de @ Nathan como la respuesta correcta.
Oliver
44
Yo tenía el mismo problema después de correr apt-get dist-upgrade, que actualiza el paquete nginx, lo que crea un vínculo en /etc/nginx/sites-enableda /etc/nginx/sites-available/default. nginx estaba tratando de cargar esta configuración predeterminada, que escucha el puerto 80 a través de IPv6, luego también estaba cargando mi lectura de mis configuraciones reales. Eliminar ese enlace simbólico solucionó el problema.
Dan Dascalescu
15
NO NECESITA BORRAR /etc/nginx/sites-available/default , simplemente elimine el enlace simbólico a él -sudo rm /etc/nginx/sites-enabled/default
d4nyll
Experimenté este problema al intentar ejecutar nginxen el puerto 8080 y varnishen el puerto 80 y similar a esta respuesta, encontré el problema con una nginxconfiguración predeterminada que todavía escuchaba en el puerto 80 a pesar de que sites-availabletodas mis configuraciones escuchaban en el puerto 8080. Esto estaba ubicado en/etc/nginx/conf.d/default
zigojacko
24

También recibí el mismo error.

nginx: [emerg] bind () a [::]: 80 falló (98: dirección ya en uso)

y cuando escribí el localhost en el navegador, estaba obteniendo

¡Funciona!

Esta es la página web predeterminada para este servidor.

El software del servidor web se está ejecutando pero aún no se ha agregado contenido. en lugar de la página de bienvenida de nginx, apache2 se ejecuta en el mismo puerto,

  1. busque el archivo apache2 ports.conf

    sudo /etc/apache2/ports.conf
    
  2. cambiar el puerto de otro modo 80, lo hago como70

  3. guarda el archivo

  4. reinicie su sistema

funcionará para usted también, si escribe el localhost en el navegador, obtendrá la página de bienvenida de nginx

SAURABH
fuente
1
Es posible que simplemente no desee ejecutar Apache2 y nginx al mismo tiempo. Encontré que la instalación de Apache inicia el servicio. Entonces, publiqué "sudo /etc/init.d/apache2 stop", y luego pude iniciar nginx normalmente. Esto también le evita reiniciar su sistema.
Chris Westin
1
Tiene razón en que eliminar el enlace simbólico / etc / nginx / sites-enabled / default impide que escuche en dos puertos. En realidad, me parece un poco molesto que cada tutorial en nginx comience sugiriendo que todos eliminen el enlace "predeterminado", pero supongo que ese es un tema diferente.
eschipul
@IgorGanapolsky cambia Apache a un puerto diferente?
Menasheh
10

intenta hacer este comando

sudo fuser -k 443/tcp
service nginx restart
Jack
fuente
8

Mi problema era que tenía directivas de escucha superpuestas. He logrado descifrar directivas superpuestas ejecutando

grep -r listen /etc/nginx/*

Se escuchaban dos archivos en el mismo puerto:

/etc/nginx/conf.d/default.conf:           listen 80;  
/etc/nginx/sites-enabled/default.conf:    listen 80;
Negro
fuente
3
Esa es una forma muy clara de verificar las cosas: ¡ grep -r listen /etc/nginx/*gracias por compartir!
Newskooler
6

Tuve el mismo problema en letsencrypt (certbot) y nginx,

ref: https://github.com/certbot/certbot/issues/5486

este error aún no tiene solución

entonces, se cambió un cron para renovar (poner una recarga después de renovar) (usando la sugerencia de certbot)

-- in /etc/cron.d/certbot
from
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew 
to
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --pre-hook "service nginx stop" --post-hook "service nginx start"

registros (cortos):

-- in /var/log/syslog
Jun 10 00:14:25 localhost systemd[1]: Starting Certbot...
Jun 10 00:14:38 localhost certbot[22222]: nginx: [error] open() "/run/nginx.pid$
Jun 10 00:14:41 localhost certbot[22222]: Hook command "nginx" returned error c$
Jun 10 00:14:41 localhost certbot[22222]: Error output from nginx:
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] still could not bind()
Jun 10 00:14:41 localhost systemd[1]: Started Certbot.


-- in /var/log/nginx/error.log
2018/06/10 00:14:27 [notice] 22233#22233: signal process started
2018/06/10 00:14:31 [notice] 22237#22237: signal process started
2018/06/10 00:14:33 [notice] 22240#22240: signal process started
2018/06/10 00:14:34 [notice] 22245#22245: signal process started
2018/06/10 00:14:38 [notice] 22255#22255: signal process started
2018/06/10 00:14:38 [error] 22255#22255: open() "/run/nginx.pid" failed (2: No $
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: still could not bind()
Wagner Pereira
fuente
1
super aleatorio, pero este fue mi problema, creo. Gracias por publicar esto. mi error parecía manifestarse debido a una entrada de dominio desactualizada que intentaba renovar pero no podía porque ya no controlaba el dominio.
w--
Supongo que este es probablemente mi problema también. pero tengo que esperar para echar un vistazo
Oscar Zhou1989
2

Primero cambie el puerto de escucha apache 80 a 8080 apache en /etc/apache2/ports.conf include

Listen 1.2.3.4:80 to 1.2.3.4:8080
sudo service apache2 restart 

o

sudo service httpd restart    // in case of centos

luego agregue nginx como servidor proxy inverso que escuchará el puerto apache

server {
 listen   1.2.3.4:80;
 server_name  some.com;

 access_log  /var/log/nginx/something-access.log;

 location / {
  proxy_pass http://localhost:8080;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }


location ~* ^.+\.(jpg|js|jpeg|png)$ {
   root /usr/share/nginx/html/;
}

location /404.html {
  root /usr/share/nginx/html/40x.html;
}

error_page 404 /404.html;
    location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
    location = /50x.html {
}

# put code for static content like js/css/images/fonts
}

Después de los cambios, reinicie el servidor nginx

sudo service nginx restart

Ahora todo el tráfico será manejado por el servidor nginx y enviará todas las solicitudes dinámicas a apache y el servidor nginx atenderá la contención estática.

Para configuración avanzada como caché:

https://www.linode.com/docs/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/#basic-nginx-caching

Kamal Kumar
fuente
1

Me encontré con un problema similar. el registro es como abajo

2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: still could not bind()
2018/10/31 12:54:23 [alert] 127997#127997: unlink() "/run/nginx.pid" failed (2: No such file or directory)
2018/10/31 22:40:48 [info] 36948#36948: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:68
2018/10/31 22:50:40 [emerg] 37638#37638: duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/default:18
2018/10/31 22:51:33 [info] 37787#37787: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:68

El último [emerg]muestra lo que duplicate listen options for [::]:80significa que hay más de un archivo de bloque nginx que contiene [::]:80.

Mi solución es eliminar una de las [::]:80configuraciones

PD: probablemente tenga un archivo de bloqueo predeterminado. Mi consejo es mantener este archivo como servidor predeterminado para el puerto 80. y eliminarlo [::]:80de otros archivos de bloque

Oscar Zhou1989
fuente
1

Uso supervisor para ejecutar Nginx y Gunicorn lado a lado en un contenedor Docker.

Esta fue la configuración utilizada para el supervisor:

[supervisord]
nodaemon=true

[program:gunicorn]
command = /project/start.sh
user = www-data


[program:nginx]
command=/usr/sbin/nginx

El problema fue cómo lancé Ngnix: por defecto, se ejecuta en primer plano. Esto hace que supervisar vuelva a intentar ejecutar otra instancia de Nginx.

Al agregar -g 'daemon off;'a la línea de comando, Nginx permaneció en primer plano, el supervisor dejó de intentar ejecutar otra instancia.

Sebastien DA ROCHA
fuente
1

En mi caso, uno de los servicios, ya sea Apache, Apache2 o Nginx, ya se estaba ejecutando y, debido a eso, no pude iniciar el otro servicio.

Rishikesh Chandra
fuente
0

Tenía varios archivos * .save (volcados de emergencia de nano) de diferentes archivos de configuración NGINX en el directorio disponible de mis sitios. Una vez que eliminé estos archivos .save, NGINX se reinició bien. Asumí que estos eran inofensivos ya que no había enlaces simbólicos correspondientes, pero supongo que estaba equivocado.

Allen
fuente
0

Para seguir a @ lfender6445 y @SAURABH respuestas:

Mi problema también fue el hecho de que después de actualizar a Vagrant 2.2.2, Apache2 se estaba ejecutando como un servidor web cuando el invitado arrancaba. En el pasado solo tenía nginx como servidor web.

ssh vagabundo en el cuadro y ejecute el siguiente comando para deshabilitar Apache2 de iniciarse cada vez que se inicia el cuadro de invitado:

sudo update-rc.d -f apache2 remove

Salga de ssh, alto vagabundo, vagabundo arriba. Problema resuelto.

Lance Cleveland
fuente
0

Si el problema persiste después de probar cualquiera de las soluciones anteriores, reinicie su servidor una vez. Funcionó para mí :)

Deejay
fuente
Sí lo haría. Pero matar el proceso nginx y luego reiniciar solo nginx también funciona. Esa es la respuesta de @datdinhquoc.
Khom Nazid
0

En mi caso, el culpable resultó ser un bloque de servidor que contenía:

        listen  127.0.0.1:80;
        listen  [::1]:80 ipv6only=on;
        server_name  localhost;

En Linux, un socket que escucha en una IP específica (por ejemplo [::1]:80) entra en conflicto con un socket que escucha en el mismo puerto pero cualquier IP (es decir [::]:80). Normalmente, nginx tratará este problema de forma transparente utilizando un único socket detrás de estas escenas. Sin embargo, especificar explícitamente ipv6only(o ciertas otras opciones) en la directiva de escucha obliga a nginx a (intentar) crear un socket separado para ello, lo que resulta en el Address already in useerror.

Como ipv6only=ones el valor predeterminado de todos modos (desde 1.3.4), la solución fue simplemente eliminar esa opción de esta directiva y asegurarse de que ipv6onlyno se usara en ningún otro lugar de mi configuración.

Matthijs
fuente
0

Tengo el mismo problema, pero veo que el puerto 80 escuchado por Nginx:

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      9730/nginx 

Pero cuando intento reiniciarlo, aparece el error:

    service nginx restart
Stopping nginx:                                            [FAILED]
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] still could not bind()

Mi problema estaba en el archivo de configuración, estoy configurado como archivo PID y parece que el sistema no puede detectarlo correctamente:

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

Cuando lo quité, funcionó.

zombi_man
fuente