it-swarm.com.de

Wie starte ich nginx erst neu, nachdem der Konfigurationstest unter Ubuntu erfolgreich war?

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 lade nur die nignx site configs ohne Neustart neu:

nginx -s reload

Gibt es eine Möglichkeit, diese beiden Befehle zu kombinieren, bei denen der Neustartbefehl vom Ergebnis des Konfigurationstests abhängig ist?

Ich konnte das nicht online finden und die offizielle Dokumentation dazu ist eher grundlegend. Ich kenne mich mit Linux nicht so gut aus, also weiß ich nicht, ob das, wonach ich suche, direkt vor mir liegt oder überhaupt nicht möglich ist.

Ich benutze Nginx v1.1.19.

98
jan

Soweit ich weiß, würde nginx tatsächlich 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, anzuhalten, aber nicht zu starten.

44

Ab Nginx 1.8.0 ist die richtige Lösung

Sudo nginx -t && Sudo service nginx reload

Beachten Sie, dass configtest aufgrund eines Fehlers immer einen Exit-Code von Null zurückgibt , auch wenn die Konfigurationsdatei einen Fehler aufweist.

65
Dan Dascalescu

Ich verwende den folgenden Befehl, um Nginx (Version 1.5.9) nur dann neu zu laden, wenn ein Konfigurationstest erfolgreich war:

/etc/init.d/nginx configtest && Sudo /etc/init.d/nginx reload

Wenn Sie dies häufig tun müssen, möchten Sie möglicherweise einen Alias ​​verwenden. Ich benutze folgendes:

alias n='/etc/init.d/nginx configtest && Sudo /etc/init.d/nginx reload'

Den Trick macht hier das "&&", das den zweiten Befehl nur ausführt, wenn der erste erfolgreich war. Sie können hier eine detailliertere Erklärung der Verwendung des Operators "&&" sehen.

Sie können "restart" anstelle von "reload" verwenden, wenn Sie den Server wirklich neu starten möchten.

38
alias nginx.start='Sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='Sudo nginx -s stop'
alias nginx.reload='Sudo nginx -s reload'
alias nginx.config='Sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

und benutze dann die Befehle "nginx.reload" etc ..

8
MechanisM

Sie können mit /etc/init.d/nginx reload Und Sudo service nginx reload Neu laden.

Wenn nginx -t Einen Fehler ausgibt, wird er nicht neu geladen

verwenden Sie daher &&, um beide gleichzeitig auszuführen

mögen

nginx -t && /etc/init.d/nginx reload

3
gokul kandasamy

Sie können Signale zur Steuerung von Nginx verwenden.

Laut Dokumentation müssen Sie das HUP-Signal an den Nginx-Master-Prozess senden.

HUP - Konfiguration ändern, mit einer geänderten Zeitzone Schritt halten (nur für FreeBSD und Linux), neue Worker-Prozesse mit einer neuen Konfiguration starten, alte Worker-Prozesse ordnungsgemäß herunterfahren

Überprüfen Sie die Dokumentation hier: http://nginx.org/en/docs/control.html

Sie können das HUP-Signal wie folgt an die Nginx-Master-Prozess-PID senden:

kill -HUP $( cat /var/run/nginx.pid )

Der obige Befehl liest die Nginx-PID aus /var/run/nginx.pid. Standardmäßig wird nginx pid in /usr/local/nginx/logs/nginx.pid Geschrieben, dies kann jedoch in config überschrieben werden. Überprüfen Sie Ihren nginx.config, Um zu sehen, wo die PID gespeichert wird.

2
hcristea

Zumindest unter Debian verfügt das nginx-Startskript über eine Reload-Funktion, die Folgendes bewirkt:

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

Es scheint, als müssten Sie nur service nginx reload Anstelle von restart aufrufen, da es test_nginx_config Aufruft.

1
Daenney