Nginx kann nicht beendet werden und nginx.pid fehlt

33

Ich möchte Nginx stoppen, aber es schlägt so fehl.

$ sudo service nginx stop
Stopping nginx:                                            [FAILED]

Und nginx.confdas definiert Ort von nginx.pid haben eine Linie.

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

Aber es gibt keine nginx.pidim Verzeichnis /var/run/.

locate nginx.pid zeigt diese Ausgabe.

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

Aber nachdem updatedbes keine Übereinstimmung für die Suche gibt. Ich verwende Nginx / 1.4.4 in CentOS release 6.5 (Final).

Was soll ich tun, um den Nginx-Daemon zu stoppen?

Edit 2014/01/07

Dies ist eine Ausgabe von ps -ef | grep nginx, anscheinend läuft der Nginx-Daemon noch.

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  

Und sudo service nginx restartgibt diesen Fehler. Ich glaube nginx, der Start scheitert, weil der Alte noch lebt. Und /var/log/nginx/error.log-2014017enthält auch diesen Fehler.

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]
Eisen und Sand
quelle
3
Das System kann nginx nicht stoppen, wenn es nicht läuft, und da es keine PID-Datei gibt, vermute ich, dass es bereits gestoppt ist. Sie können mit ps -ef | grep nginxoder überprüfen sudo netstat -tlnp | grep nginx.
Ladadadada
1
Danke für deinen Rat. Ich fügte Ergebnis des psBefehls hinzu.
Eisen und

Antworten:

37

Ich empfehle, Nginx zu stoppen, indem Sie zuerst den Master-Prozess beenden. Das nginx wird möglicherweise nicht ordnungsgemäß heruntergefahren, da es mit dem init-Skript nicht gestoppt werden kann.

ps -ef | grep nginx

Dies zeigt Ihnen die PID des Nginx-Master-Prozesses. Wie du oben erwähnt hast:

wurzel 19506 1 0 2013? 00:00:00 nginx: master process / usr / sbin / nginx -c /etc/nginx/nginx.conf

Töte es mit

töten -9 19506

Überprüfen Sie erneut, ob ein Nginx-Prozess ausgeführt wird oder Port 80 belegt ist. Wenn Sie feststellen, dass ein Prozess an Port 80 gebunden ist, identifizieren Sie die PID und prüfen Sie, ob sie beendet werden kann.

ps -ef | grep nginx

netstat -tulpn | grep 80

Stellen Sie sicher, dass das Dateisystem in Ordnung ist und Sie in das Dateisystem / var lesen / schreiben können. Dann Nginx starten

Service Nginx starten

sandeep.s85
quelle
Vielen Dank! Nachdem ich den Master-Prozess beendet hatte, musste ich auch den Nginx-Worker-Prozess beenden. Dann kann ich endlich nginx daemon starten.
Eisen und
Du hast gerade eine Seele gerettet, Sandeep! Vielen Dank für die Dokumentation ..
Thale
Vielen Dank an sandeep.s85. Nützlich für mich auch. Aus Interesse, was würde dazu führen, dass die Datei nginx.pid fehlt, während nginx ausgeführt wird?
Codemonkey
Das ist mir gerade wieder passiert, ich wünschte ich wüsste, was es verursacht.
Codemonkey
Mein Nginx-Master-Prozess wird wieder lebendig, nachdem ich ihn getötet habe.
WTIFS
11

Problem

Für mich war der PID-Dateiname in diesen beiden Dateien unterschiedlich:

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

Diese beiden müssen zusammenpassen.

Fix:

Also habe ich es in /usr/lib/systemd/system/nginx.service angepasst und dann getan:

systemctl daemon-reload
systemctl start nginx

Dann kam es richtig.

Patrick Boos
quelle
3
Woher? In Ubuntu /var/run/ist ein Symlink von/run/
Z. Zlatev
Ja, das ist überhaupt keine Lösung. Aber in meinem Fall ist alles /run/nginx.pid.
danger89
Meine nginx.conf hatte pid logs / nginx.pid - geändert zu /run/nginx.pid und es wurde behoben, danke Patrick!
Phpguru
9

Ich hatte dieses Problem, und das Laufen ps -ef | grep nginxwürde mir zeigen, dass sich die Arbeiter weiter drehen, obwohl der Master-Prozess abgebrochen wurde, wie in der akzeptierten Antwort vorgeschlagen:

[~]# 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    

Also meine Lösung war es einfach , dies zu beheben:pkill nginx && service nginx restart

amurrell
quelle
1

Mein Problem war, dass ich pidin zwei verschiedenen conf-Dateien angegeben hatte. Nachdem ich einen Verweis entfernt hatte, löschte ich die .pidDatei und startete nginx erneut. Es begann sich normal zu verhalten.

matthewdaniel
quelle
Ja, die PID ist in /usr/lib/systemd/system/nginx-debug.service und /etc/nginx/nginx.conf
edmondscommerce
0

Dies scheint darauf hinzudeuten, dass nginx sofort abstürzt, wenn es früher gestartet wurde. Haben Sie den Inhalt von überprüft, um /var/log/nginx*zu sehen, was der Prozess tut?

EDIT: Wenn Sie uns auch Ihr Betriebssystem und Ihre Version von nginx mitteilen, können wir detailliertere Antworten geben.

zymhan
quelle
0

Ich würde mehr Informationen benötigen, um sicherzugehen, aber ich vermute, Sie haben bereits einen anderen Webserver, der ausgeführt wird, anstatt die Instanz von ngnix, die Sie selbst haben möchten. Sie müssen sie also finden - der Fehler besagt, dass Port 80 verwendet wird, aber nicht von Was

Versuchen Sie netstat -tulpn- Sie suchen nach einem Eintrag unter der lokalen Adresse, der auf 80 endet - hier werden Ihnen auch der Programmname und die PID angezeigt, damit Sie sie identifizieren können. Hier ist meins - ich verwende lighttpd und es wird in der 3. Zeile angezeigt.

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

Fahren Sie den anderen Webserver ordnungsgemäß herunter (da ein normaler Kill möglicherweise nicht funktioniert, wenn der Startvorgang beendet ist) und versuchen Sie, ngnix zu starten. In diesem Fall können / sollten Sie Ihre Init-Skripte bearbeiten, um den Start des anderen Webservers zu unterbinden, oder die Konfiguration auf einem anderen Computer anpassen.

Geselle Geek
quelle
Danke für Ihre Hilfe. netstat -tulpnzeigt tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginx. Irgendwie belegte Nginx diesen Port. Aber wie Sandeep sagte, ich habe den Nginx-Prozess getötet, dann funktioniert es. Ich schätze Ihre Hilfe!
Eisen und
0

Ich hatte ein ähnliches Problem mit Ubuntu 10.10 und einer kompilierten Version von nginx, die unter / opt / nginx / sbin ausgeführt wurde.

Überprüfen Sie die Dateien /opt/nginx/conf/nginx.conf und /etc/nginx/nginx.conf und stellen Sie sicher, dass sie übereinstimmen.

Passen Sie die Startdatei /etc/init.d/nginx an die Position von nginx.pid an, indem Sie Folgendes verwenden:

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
quelle
0

Um Nginx zu stoppen, lesen Sie das Handbuch man nginx.

Standardmäßig sollte das Stoppsignal mit verwendet werden nginx -s stop.

Sollte eigentlich so einfach sein. Ihre Möglichkeiten sind:

stop, quit, reopen, reload.
prosti
quelle