Nginx ne parvient pas à s'arrêter et nginx.pid est manquant

33

Je veux arrêter Nginx mais ça échoue comme ça.

$ sudo service nginx stop
Stopping nginx:                                            [FAILED]

Et nginx.confcela définit la place de nginx.pid avoir une ligne.

# /etc/nginx/nginx.conf
pid        /var/run/nginx.pid;

Mais il n'y a pas nginx.piddans le répertoire /var/run/.

locate nginx.pid montre cette sortie.

/var/run/nginx.pid 
/var/run/nginx.pid.oldbin

Mais après updatedbil n'y a pas de correspondance pour la recherche. J'utilise nginx / 1.4.4 dans CentOS release 6.5 (Final).

Que dois-je faire pour arrêter le démon nginx?

Edit 2014/01/07

Ceci est la sortie de ps -ef | grep nginx, il semble que le démon nginx soit toujours en cours d'exécution.

ironsand 17065 16933  0 15:55 pts/0    00:00:00 grep --color nginx
root     19506     1  0  2013 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
ironsand 19507 19506  0  2013 ?        00:00:25 nginx: worker process  

Et sudo service nginx restartdonne cette erreur. Je pense nginxne pas commencer parce que le vieil est encore en vie Et /var/log/nginx/error.log-2014017contient aussi cette erreur.

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:80 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:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
                                                           [FAILED]
fer à repasser
la source
3
Le système ne peut pas arrêter nginx s'il n'est pas en cours d'exécution et puisqu'il n'y a pas de fichier PID, je suppose qu'il est déjà arrêté. Vous pouvez vérifier avec ps -ef | grep nginxou sudo netstat -tlnp | grep nginx.
Ladadadada
1
Merci pour vos conseils. J'ai ajouté le résultat de la pscommande.
ironsand

Réponses:

37

Je recommanderai d'arrêter nginx en supprimant d'abord son processus principal. Le nginx n’est pas arrêté correctement peut-être parce qu’il ne peut pas être arrêté à l’aide du script init.

ps -ef | grep nginx

Cela vous montrera le PID du processus maître nginx. Comme vous l'avez mentionné ci-dessus:

root 19506 1 0 2013? 00:00:00 nginx: processus maître / usr / sbin / nginx -c /etc/nginx/nginx.conf

Tuez-le en utilisant

tuer -9 19506

Vérifiez à nouveau si un processus nginx en cours d'exécution ou si le port 80 est occupé. Si un processus est lié au port 80, identifiez le PID et vérifiez s'il peut être tué.

ps -ef | grep nginx

netstat -tulpn | grep 80

assurez-vous que le système de fichiers est correct et que vous pouvez lire / écrire dans le système de fichiers / var. Puis lancez nginx

service nginx start

sandeep.s85
la source
Merci! Après avoir tué le processus principal, je devais également tuer le processus de travail nginx. Ensuite, je peux enfin démarrer le démon nginx.
ironsand
Vous venez de sauver une âme, Sandeep! Merci beaucoup pour la documentation ..
Thale
Merci @ sandeep.s85. Utile pour moi aussi. Par intérêt, qu'est-ce qui ferait manquer le fichier nginx.pid pendant l'exécution de nginx?
Codemonkey
Cela vient de se reproduire pour moi, j'aimerais savoir ce qui le cause.
Codemonkey
Mon processus maître nginx revient vivre après que je le tue.
WTIFS
11

Problème

Pour moi, le nom du fichier pid était différent dans ces deux fichiers:

  • /usr/lib/systemd/system/nginx.service
    • pid /var/run/nginx.pid;
  • /etc/nginx/nginx.conf
    • PIDFile=/run/nginx.pid

Ces deux doivent correspondre.

Réparer:

Alors je l'ai ajusté dans /usr/lib/systemd/system/nginx.service et ensuite:

systemctl daemon-reload
systemctl start nginx

Ensuite, il est venu correctement.

Patrick Boos
la source
3
Comment venir? Dans Ubuntu se /var/run/trouve un lien symbolique de/run/
Z. Zlatev,
Oui, ce n'est pas une solution du tout. Mais dans mon cas, tout est /run/nginx.pid.
danger89
Mon fichier nginx.conf contenait pid logs / nginx.pid; il a été remplacé par /run/nginx.pid et le problème a été corrigé, merci Patrick!
phpguru
9

J'avais ce problème, et courir ps -ef | grep nginxme montrait des ouvriers qui continueraient à filer en dépit de la destruction du processus maître suggéré par la réponse acceptée:

[~]# ps -ef | grep nginx
nginx    10730     1  0 Sep14 ?        00:00:16 nginx: cache manager process            
nginx    18469     1  0 Oct09 ?        00:11:02 nginx: worker process                   
nginx    25779     1  0 Oct13 ?        00:01:31 nginx: worker process                   
nginx    26458     1  0 15:45 ?        00:00:00 nginx: worker process    

Donc, ma solution pour y remédier était simplement la suivante:pkill nginx && service nginx restart

amurrell
la source
1

Mon problème était que j'avais pidspécifié dans deux fichiers de configuration différents. Après avoir supprimé une référence, puis supprimé le .pidfichier et relancé nginx, il a commencé à se comporter normalement.

matthewdaniel
la source
Oui, le PID est défini dans /usr/lib/systemd/system/nginx-debug.service et /etc/nginx/nginx.conf
edmondscommerce
0

Cela semble indiquer que nginx se bloque immédiatement s'il avait été démarré plus tôt. Avez-vous vérifié le contenu de /var/log/nginx*pour voir ce que fait le processus?

EDIT: De plus, si vous nous indiquez votre système d’exploitation et votre version de nginx, nous pourrons vous donner des réponses plus détaillées.

zymhan
la source
0

J'aurais besoin de plus d'informations pour en être sûr, mais je suppose que vous avez déjà un autre serveur Web en cours d'exécution plutôt que l'instance de ngnix que vous souhaitez vous-même. Vous devez donc le trouver. L'erreur indique que le port 80 est utilisé, mais pas par quoi

Essayez netstat -tulpn- Vous cherchez une entrée sous l’adresse locale qui se termine par: 80 - elle vous donnera également le nom du programme et le PID afin que vous puissiez l’identifier. Voici le mien - je cours lighttpd et il est montré sur la 3ème ligne.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      4684/rtorrent
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      923/php-fpm.conf)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      972/lighttpd
tcp        0      0 0.0.0.0:6901            0.0.0.0:*               LISTEN      4684/rtorrent
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      720/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      720/sshd
udp        0      0 0.0.0.0:6881            0.0.0.0:*                           4684/rtorrent

Arrêtez correctement l’autre serveur Web (car si son démarrage est imminent, un «kill» normal risque de ne pas fonctionner) et essayez de démarrer ngnix. Si c'est le cas, vous pouvez / devriez alors modifier vos scripts d'initialisation pour empêcher le démarrage de l'autre serveur Web ou ajuster sa configuration sur une autre source d'alimentation.

Compagnon geek
la source
Merci de votre aide. netstat -tulpnmontre tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginx. Donc, d'une manière ou d'une autre, Nginx occupait ce port. Mais comme l'a dit Sandeep, j'ai tué le processus nginx, puis cela fonctionne. J'apprécie ton aide!
ironsand
0

J'ai eu un problème similaire avec Ubuntu 10.10 et une version compilée de nginx fonctionnant dans / opt / nginx / sbin.

vérifiez les fichiers /opt/nginx/conf/nginx.conf et /etc/nginx/nginx.conf et vérifiez qu'ils correspondent.

Ajustez le fichier de démarrage /etc/init.d/nginx pour qu'il corresponde au test d'emplacement nginx.pid à l'aide de:

sudo /etc/init.d/nginx configtest # should show no failures
sudo /etc/init.d/nginx start      # should show starting
sudo /etc/init.d/nginx status     # should show running
sudo /etc/init.d/nginx stop       # should show stopping -- (wait for a few)
sudo /etc/init.d/nginx status     # should show can not access PID file for nginx
sudo netstat -tap  # should not show nginx program running with open local address
Pete Williams
la source
0

Pour arrêter nginx, consultez le manuel d'utilisation man nginx.

Le moyen par défaut devrait être d'utiliser le signal d'arrêt avec nginx -s stop.

Devrait être aussi simple que cela. Vos options sont:

stop, quit, reopen, reload.
prosti
la source