Impossible de redémarrer nginx, la liaison () a échoué (98: adresse déjà utilisée)

9

Je sais que ce sujet existe sous différentes formes, mais j'ai du mal à résoudre mon problème. Si je lance service nginx restart, nginx échoue avec le journal suivant:

2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2015/03/14 08:36:42 [emerg] 9400#0: still could not bind()

Je n'ai qu'une seule configuration en cours de chargement sites-enabled. Quand je cours:

$ grep -slir "listen 80"
$ sites-available/default

Cela montre que la defaultconfig a écouté 80, mais cela ne devrait pas avoir d'importance car elle n'est pas là sites-enabled.

$ ps ax -o pid,ppid,%cpu,vsz,wchan,command|egrep '(nginx|PID)'
  PID  PPID %CPU    VSZ WCHAN  COMMAND
 9468     1  0.0  97188 sigsus nginx: master process /usr/sbin/nginx
 9471  9468  0.0  97328 ep_pol nginx: worker process
 9472  9468  0.0  97368 ep_pol nginx: worker process
 9693  9641  0.0   9448 pipe_w egrep --color=auto (nginx|PID)

Voici une netstatillustration des ports utilisés:

$ netstat -tulpn

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1300/master
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      9468/nginx
tcp        0      0 0.0.0.0:2812            0.0.0.0:*               LISTEN      5980/monit
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1174/mysqld
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      1155/memcached
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      9468/nginx
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1113/sshd
tcp6       0      0 :::25                   :::*                    LISTEN      1300/master
tcp6       0      0 :::9000                 :::*                    LISTEN      9106/hhvm
tcp6       0      0 :::22                   :::*                    LISTEN      1113/sshd
udp        0      0 127.0.0.1:11211         0.0.0.0:*                           1155/memcached

Et voici ma configuration complète sites-enabled(la seule là-dedans):

server {
    listen                  443 ssl default_server;

    limit_conn              gulag 15;
    server_name             www.my-website.com;

    access_log              /home/my-website/logs/access.log;
    error_log               /home/my-website/logs/error.log info;

    root                    /home/my-website/web;
    index                   index.php index.html;

    ssl_certificate /etc/nginx/ssl/my-website.com.chained.crt;
    ssl_certificate_key /etc/nginx/ssl/my-website.com.key;
    ssl_prefer_server_ciphers On;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;

    include                 /etc/nginx/includes/my-website_redirects_https.inc;
    include                 /etc/nginx/includes/file_cache.inc;
    include                 /etc/nginx/includes/wordpress.inc;
}

server {
    listen                  80;
    server_name             my-website.com www.my-website.com;
    return                  301 https://$server_name$request_uri;
}

server {
    listen                  443;
    server_name             my-website.com;
    return                  301 https://www.$server_name$request_uri;
}

server {
    server_name
        some-other-website1.com         www.some-other-website1.com
        some-other-website2.com         www.some-other-website2.com
        some-other-website3.com         www.some-other-website3.com
        some-other-website4.com         www.some-other-website4.com
        some-other-website5.com         www.some-other-website5.com

    rewrite ^(.*)$ https://www.my-website.com/some/page/ permanent;
}

server {
    server_name
        some-other-website6.com         www.some-other-website6.com
        some-other-website7.com         www.some-other-website7.com
        some-other-website8.com         www.some-other-website8.com

    rewrite ^(.*)$ https://www.my-website.com/some/other/page/ permanent;
}

server {
    server_name     subdomain.my-website.com;

    rewrite ^(.*)$ https://some.otherwebsite.com/ permanent;
}

server {
    server_name
        some-other-website9.com         www.some-other-website9.com
        some-other-website10.com         www.some-other-website10.com
        some-other-website11.com         www.some-other-website11.com

    rewrite ^(.*)$  https://www.my-website.com/ permanent;
}

Je me demande si cette erreur bind () se produit à cause de ma configuration. Des idées sur ce que je pourrais faire de mal? J'utilise nginx / 1.4.6 (Ubuntu). Toute aide serait grandement appréciée.

dallen
la source
Je suis actuellement confronté au même problème. Une configuration nginx fonctionnant une fois sans aucun changement ne se rechargera plus correctement car elle indique que le port est utilisé, cependant nginx est la seule application fonctionnant sur ce port. Avez-vous résolu votre problème?
Mitch Kent

Réponses:

13

Essayez d'arrêter nginx:

service nginx stop

Vérifiez que le nginx fonctionne toujours:

ps ax | grep nginx

Et s'il est toujours en cours d'exécution, arrêtez le processus:

kill -p PID

Vérifier l'état nginx, ne fonctionnera pas:

ps ax | grep nginx

Et puis faites un démarrage net:

service nginx start

Cela a fonctionné pour moi après le même problème.

szg28
la source
Pour moi, après avoir tué le PID, le processus recommencera
Jason Liu
4

Selon votre netstatsortie, nginx lui-même fonctionne toujours sur le port 80.

Avant d'essayer de le redémarrer, validez votre configuration avec nginx -tet corrigez les erreurs.

Michael Hampton
la source
4
J'ai exécuté nginx -t et il n'y a aucune erreur. C'est pourquoi je suis confus de ne pas pouvoir redémarrer.
dallen
Essayez d'abord d'arrêter nginx, puis de le redémarrer.
Michael Hampton
1
Je me lance dans le même problème. Je considérerais cela comme un bug de nginx.
ClojureMostly
2

Je suis probablement le seul assez stupide pour commettre cette erreur, mais j'ai accidentellement téléchargé le mauvais paquet ( phpau lieu de php-fpm), qui a installé Apache 2 en tant que dépendance. Comme il fonctionnait sur le port 80, Nginx ne pouvait pas.

Ce n'est probablement pas une erreur très courante, mais je suppose que le point à retenir est de vérifier si vous avez accidentellement autre chose sur le port 80.

Programmes Redwolf
la source
Vous n'êtes pas le premier à faire ça. Le nom du package a été mal choisi; il aurait vraiment dû être nommé à la mod_phpplace. Mais maintenant que c'est ainsi depuis des années, il ne peut pas être changé sans briser le système de tout le monde.
Michael Hampton
@MichaelHampton Au moins, c'est une solution assez simple ( apt-get remove apache2 && apt-get autoremove)
Redwolf Programs