Wenn ich den nginx-Dienst über eine Befehlszeile auf einem Ubuntu-Server neu starte, stürzt der Dienst ab, wenn eine nginx-Konfigurationsdatei Fehler enthält. Auf einem Server mit mehreren Standorten werden alle Standorte gelöscht, auch diejenigen ohne Konfigurationsfehler.
Um dies zu verhindern, führe ich zuerst den Nginx-Konfigurationstest aus:
nginx -t
Nachdem der Test erfolgreich ausgeführt wurde, konnte ich den Dienst neu starten:
/etc/init.d/nginx restart
Oder laden Sie nur die nignx-Site-Konfigurationen ohne Neustart neu:
nginx -s reload
Gibt es eine Möglichkeit, diese beiden Befehle zu kombinieren, bei denen der Befehl zum Neustart vom Ergebnis des Konfigurationstests abhängig ist?
Ich konnte dies online nicht finden und die offizielle Dokumentation dazu ist ziemlich einfach. Ich kenne mich mit Linux nicht so gut aus, daher weiß ich nicht, ob das, wonach ich suche, direkt vor mir liegt oder überhaupt nicht möglich ist.
Ich verwende Nginx v1.1.19.
Antworten:
Soweit ich weiß, würde nginx eine leere Nachricht anzeigen und nicht neu starten, wenn die Konfiguration schlecht ist.
Die einzige Möglichkeit, es zu vermasseln, besteht darin, einen Nginx-Stopp durchzuführen und dann erneut zu starten. Es würde gelingen aufzuhören, aber nicht zu starten.
quelle
service nginx reload
zeigt nichts an, ob die Konfiguration korrekt geladen wurde oder nicht, daher ist es nutzlos, wenn Sie den Verdacht haben, dass die Konfiguration falsch ist.service nginx restart
stoppt den Server, wenn die Konfiguration einen Fehler hat!Ab Nginx 1.8.0 ist die richtige Lösung
Beachten Sie, dass aufgrund eines Fehlers
configtest
immer ein Exit-Code von Null zurückgegeben wird, auch wenn in der Konfigurationsdatei ein Fehler vorliegt.quelle
nginx -t
Ohne Sudo wird es mit ziemlicher Sicherheit an Berechtigungsfehlern scheitern.Ich verwende den folgenden Befehl, um Nginx (Version 1.5.9) nur dann neu zu laden, wenn ein Konfigurationstest erfolgreich war:
Wenn Sie dies häufig tun müssen, möchten Sie möglicherweise einen Alias verwenden. Ich benutze folgendes:
Der Trick hier wird durch das "&&" gemacht, das den zweiten Befehl nur ausführt, wenn der erste erfolgreich war. Sie können sehen , hier eine ausführlichere Erklärung der Verwendung des „&&“ Operator.
Sie können "Neustart" anstelle von "Neuladen" verwenden, wenn Sie den Server wirklich neu starten möchten.
quelle
pkill -1 nginx
(effektiv, was mein rel.d / nginx-Reload bewirkt), dass es NICHT neu geladen wird, wenn die Konfiguration fehlschlägt und irreführend erfolgreich zurückgibt. Überprüfen Sie Ihre eigenen Versionen.nginx -t
stattdessen.und verwenden Sie dann die Befehle "nginx.reload" etc ..
quelle
Sie können mit
/etc/init.d/nginx reload
und neu ladensudo service nginx reload
Wenn
nginx -t
ein Fehler auftritt, wird er nicht neu geladenVerwenden Sie also &&, um beide gleichzeitig auszuführen
mögen
quelle
run both at a same time
Der Befehl auf der rechten Seite wird ausgeführt, wenn der Befehl auf der linken Seite einen Exit-Code von 0 zurückgibt. Wenn Sienginx -t
einen Fehler auslösen, ist der Exit-Code nicht 0, sodass der zweite Befehl nicht ausgeführt wird. Es istnginx -s reload
sowiesoIf nginx -t throws some error then it won't reload
. Die Anweisungrun both at a same time
kann auch als einzelner Befehl oder als eine Zeile interpretiert werden. Ich interpretiere ihn in diesem Fall nicht unbedingt soin parallel
.Sie können Signale verwenden, um Nginx zu steuern.
Laut Dokumentation müssen Sie das HUP-Signal an den Nginx-Master-Prozess senden.
Überprüfen Sie die Dokumentation hier: http://nginx.org/en/docs/control.html
Sie können das HUP-Signal wie folgt an die PID des Nginx-Master-Prozesses senden:
Der obige Befehl liest die Nginx-PID von
/var/run/nginx.pid
. Standardmäßig wird nginx pid geschrieben/usr/local/nginx/logs/nginx.pid
, dies kann jedoch in der Konfiguration überschrieben werden. Überprüfen Sienginx.config
, wo die PID gespeichert wird.quelle
Zumindest unter Debian verfügt das Nginx-Startskript über eine Reload-Funktion, die Folgendes bewirkt:
Alles, was Sie tun müssen, ist anzurufen,
service nginx reload
anstattrestart
es anzurufentest_nginx_config
.quelle
service nginx reload
gibt keinen Hinweis darauf, ob die Konfiguration in Ordnung getestet wurde oder nicht oder ob sie neu geladen wurde oder nicht.test_nginx_config
man dann in diesem Fall?service nginx reload
ist in der Befehlszeile ausreichend, aber manchmal möchten Sie möglicherweise die stderr-Ausgabe erfassen und diese zur Fehlerbehebung an ein Skript zurückgeben.nginx -t
würde Ihnen sagen, welche Datei den ungültigen Parameter hatte und in welcher Zeile.