web-dev-qa-db-fra.com

nginx - nginx: [émerg] bind () à [::]: 80 a échoué (98: adresse déjà utilisée)

Tout à coup, je reçois l'erreur nginx ci-dessous

 * 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 je cours 

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

Je n'ai rien Rien sur le port 80

Puis je lance le ci-dessous:

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   - 

Je suis perplexe.

Comment déboguer?

J'utilise uwsgi avec 

proxy pass sur le port 8070. uwsgi est en cours d'exécution. Nginx n'est pas. J'utilise Ubuntu 12.4

Vous trouverez ci-dessous les parties pertinentes de mon fichier de configuration nginx.

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;
                 }
        }

Voici comment j'installe nginx sur Ubuntu 12.04

nginx=stable;add-apt-repository ppa:nginx/$nginx;
apt-get update
apt get install nginx-full
183
Tampa

[::]:80 est une adresse ipv6.

Cette erreur peut être provoquée si une configuration nginx est à l'écoute sur le port 80 et sur le port [::]:80.

J'ai eu le suivant dans mon fichier de sites disponibles par défaut:

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

Vous pouvez résoudre ce problème en ajoutant ipv6only=on au [::]:80 comme ceci:

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

Pour plus d'informations, voir:

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

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

184
Nathan

j'ai corrigé cela en exécutant Sudo apachectl stop - s'avère qu'Apache s'exécutait en arrière-plan et empêchait nginx de démarrer sur le port souhaité. 

Sous ubuntu, lancez Sudo /etc/init.d/Apache2 stop

172
lfender6445

J'ai trouvé le problème que je n'avais jamais eu auparavant.

Je viens juste de supprimer /etc/nginx/sites-available/default. Ensuite cela a fonctionné.

Ma conf était dans /etc/nginx/default.

32
Tampa

J'obtenais aussi la même erreur . nginx: [émergent] bind () à [::]: 80 a échoué (98: adresse déjà utilisée) et quand j'ai tapé l'hôte local dans le navigateur, alors j'obtenais 

Ça marche!

Ceci est la page Web par défaut pour ce serveur.

Le logiciel du serveur Web est en cours d’exécution, mais aucun contenu n’a été ajouté pour le moment… .. au lieu de la page d’accueil de nginx, Apache2 est exécuté sur le même port,

  1. trouver le fichier Apache2 ports.conf 

    Sudo /etc/Apache2/ports.conf

  2. changer le port autre que 80, je le fais en tant que 70 

  3. sauvegarder le fichier 

  4. redémarrez votre système

cela fonctionnera aussi pour vous, si vous tapez localhost dans le navigateur, vous obtiendrez la page d'accueil de nginx

20
SAURABH

Mon cas est différent, j'ai dû tuer Nginx pour le redémarrer.

Au lieu de

Sudo systemctl restart nginx

Je devais utiliser:

Sudo pkill -f nginx
Sudo systemctl start nginx
16
datdinhquoc

J'ai eu le même problème dans letsencrypt (certbot) et nginx, 

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

cette erreur n'a pas encore de solution 

donc, a changé un cron pour renouveler (mettant une recharge après renouvellement) (en utilisant suggérer 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"

journaux (court):

-- 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()
4
Wagner Pereira

essayez de faire cette commande

Sudo fuser -k 443/tcp
service nginx restart
3
jack

Mon problème était que mes directives d'écoute se chevauchaient. J'ai réussi à comprendre les directives qui se chevauchent en exécutant

grep -r listen /etc/nginx/*

Deux fichiers écoutaient sur le même port:

/etc/nginx/conf.d/default.conf:           listen 80;  
/etc/nginx/sites-enabled/default.conf:    listen 80;
1
Black

J'ai rencontré le même problème. le journal est comme ci-dessous 

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

Le dernier [emerg] indique que duplicate listen options for [::]:80, ce qui signifie qu'il existe plusieurs fichiers de bloc nginx contenant [::]:80

Ma solution consiste à supprimer l'un des paramètres [::]:80 

P.S. vous avez probablement un fichier de bloc par défaut. Mon conseil est de conserver ce fichier comme serveur par défaut pour le port 80 et de supprimer [::]:80 des autres fichiers de blocage.

1
Oscar Zhou1989

Commencez par changer le port d'écoute Apache 80 en 8080 Apache dans /etc/Apache2/ports.conf include

Listen 1.2.3.4:80 to 1.2.3.4:8080
Sudo service Apache2 restart 

ou 

Sudo service httpd restart    // in case of centos

puis ajoutez nginx comme serveur proxy inverse qui écoutera le port 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
}

Après les modifications, redémarrez le serveur nginx

Sudo service nginx restart

Maintenant tout le trafic sera traité par le serveur nginx et enverra toutes les requêtes dynamiques à Apache et le contenu statique sera servi par le serveur nginx.

Pour la configuration préalable comme le cache:

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

0
Kamal Kumar

Si le problème persiste après avoir essayé l'une des solutions ci-dessus, redémarrez votre serveur une fois. Cela a fonctionné pour moi :)

0
Deejay

J'ai eu plusieurs fichiers * .save (sauvegardes d'urgence de nano) de différents fichiers de configuration NGINX dans mon répertoire sites-avilable. Une fois que j'ai supprimé ces fichiers .save, NGINX a redémarré correctement. J'ai supposé que ceux-ci étaient inoffensifs puisqu'il n'y avait pas de lien symbolique correspondant, mais je suppose que j'avais tort.

0
Allen

Dans mon cas, l'un des services, Apache, Apache2 ou Nginx, était déjà en cours d'exécution et, à cause de cela, je n'ai pas pu démarrer l'autre service.

0
Rishikesh Chandra

J'utilise superviseur pour exécuter Nginx et Gunicorn côte à côte sur un conteneur Docker.

C'était la configuration utilisée pour superviseur:

[supervisord]
nodaemon=true

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


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

Le problème était la façon dont j'ai lancé Ngnix: par défaut, il s’exécute au premier plan. Cela permet de superviser les tentatives d’exécution d’une autre instance de Nginx.

En ajoutant -g 'daemon off;' à la ligne de commande, Nginx est resté au premier plan, le superviseur a cessé d'essayer d'exécuter une autre instance.

0
Sebastien DA ROCHA

Dans mon cas, le coupable s'est avéré être un bloc serveur qui contenait:

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

Sous Linux, un socket écoutant une adresse IP spécifique (par exemple [::1]:80) est en conflit avec un socket écoutant le même port mais une adresse IP quelconque (c'est-à-dire [::]:80). Normalement, nginx résoudra ce problème de manière transparente en utilisant une seule prise derrière cette scène. Cependant, spécifier explicitement ipv6only (ou certaines autres options) dans la directive d'écoute oblige nginx à (essayer de) créer un socket distinct pour celle-ci, entraînant ainsi l'erreur Address already in use.

Comme ipv6only=on est quand même la valeur par défaut (depuis la version 1.3.4), le correctif consistait simplement à supprimer cette option de cette directive, et à s'assurer que ipv6only n'était utilisé nulle part ailleurs dans ma config.

0
Matthijs

Pour suivre @ lfender6445 et les réponses @SAURABH - 

Mon problème était également le fait qu'après la mise à niveau vers Vagrant 2.2.2, Apache2 était exécuté en tant que serveur Web au démarrage de l'invité. Dans le passé, je n'avais que nginx en tant que serveur Web.

vagrant ssh dans la boîte et exécutez la commande suivante pour empêcher Apache2 de démarrer à chaque démarrage de la boîte d'invité:

Sudo update-rc.d -f Apache2 remove

Quittez ssh, halte, vagabond. Problème résolu.

0
Lance Cleveland