Frage Nginx Config neu laden ohne Ausfallzeiten


Ich benutze Nginx als Reverse Proxy. Immer wenn ich die Konfiguration dafür mit aktualisiere

sudo "cp -r #{nginx_config_path}* /etc/nginx/sites-enabled/"
sudo "kill -s HUP `cat /var/run/nginx.pid`"

Ich habe eine kurze Ausfallzeit. Wie kann ich das vermeiden?


93
2018-04-11 17:13


Ursprung


Sind das Befehlszeilenbefehle? Ich habe noch nie jemanden gesehen, der einen ganzen Sudo-Befehl in Anführungszeichen gesetzt hat. Das ist vielleicht nicht nötig. - brianmearns
Nur ein allgemeiner Kommentar: Ich denke, der Standard / empfohlene Praxis ist eine weiche / symbolische Verknüpfung für Ihre Website-Konfiguration unter erstellen sites-enabledkopiere es nicht. Nicht in Bezug auf Ihr spezielles Problem, aber Sie können sich das genauer ansehen. - brianmearns
Sie sollten keine Ausfallzeiten haben. kill HUP ist der Weg, um ein graziöses Neuladen in nginx durchzuführen. - Jonathan Vanasco


Antworten:


Lauf service nginx reload oder /etc/init.d/nginx reload

Es wird ein Warmladen der Konfiguration ohne Ausfallzeiten durchgeführt. Wenn Sie ausstehende Anforderungen haben, wird es veraltete nginx-Prozesse geben, die mit diesen Verbindungen fertig werden, bevor sie abstürzen. Es ist also eine äußerst elegante Methode, Konfigurationen neu zu laden.

Manchmal möchten Sie vielleicht mit vorangehen sudo 


153
2018-04-11 17:24



Beide sollten genau das tun, was die Frage besagt: senden SIGHUP zum Nginx-Master-Prozess. Es sollte keinen Unterschied geben. nginx.org/de/docs/control.html - Gnarfoz
Wenn ich den Befehl auf CentOS absetze, sagt es immer "Usage /etc/init.d/nginx (start..stop ... restart..reload)" .. und genau so habe ich es benutzt. In der Datei /init.d/nginx habe ich Kill-HUP gefunden cat $PIDFILE || echo -n "kann nicht neu geladen werden" - mashup
Weißt du, wo der Unterschied liegt? service nginx reloadund nginx -s reload? Wenn ich die erstere starte, bekomme ich diese Ausgabe: Reloading nginx configuration: nginx., aber meine Änderungen werden nicht aktualisiert. Wenn ich letzteres ausführe, bekomme ich keine Ausgabe, aber meine Änderungen spiegeln sich wider. - Ryan Quinn
Ich habe das gerade versucht, nachdem ich eine hinzugefügt habe log_not_found Anweisung, aber ich musste tatsächlich einen Neustart durchführen, um es zum Laufen zu bringen. Ich denke, das Nachladen funktioniert nicht für alle Anweisungen. - mydoghasworms


Lauf /usr/sbin/nginx -s reload

Sehen http://wiki.nginx.org/CommandLine für mehr Befehlszeilenoptionen.


55
2017-07-27 13:46



Schließlich ein Befehl, der in Debian Jessie funktioniert. - danger89
Dies ist ein besserer Weg. Weil Ihr Server nicht Nieder wenn Ihre Konfigurationen Fehler aufweisen (nur Fehler in diesem Fall). - Mir-Ismaili


Nein, Sie sind falsch, Sie sollten mit dem beschriebenen Verfahren keine Ausfallzeiten haben. (Nginx kann nicht nur die Konfiguration im laufenden Betrieb ohne Ausfallzeit aktualisieren, sondern auch die Aktualisierung der ausführbaren Datei im laufenden Betrieb, ohne Ausfallzeiten.)

Nach http://nginx.org/docs/control.html#reconfigurationSenden der HUP signal to nginx stellt sicher, dass es einen graziösen Neustart ausführt, und wenn die Konfigurationsdateien nicht korrekt sind, wird die gesamte Prozedur abgebrochen und Sie bleiben mit dem nginx wie vor dem Senden des HUP Signal. Zu keinem Zeitpunkt sollte eine Ausfallzeit möglich sein.

Damit nginx die Konfigurationsdatei erneut lesen kann, sollte ein HUP-Signal an den Master-Prozess gesendet werden. Der Masterprozess prüft zuerst die Syntaxgültigkeit und versucht dann, eine neue Konfiguration anzuwenden, dh Protokolldateien und neue Listen-Sockets zu öffnen. Wenn dies fehlschlägt, werden Änderungen rückgängig gemacht und die alte Konfiguration wird fortgesetzt.


8
2018-06-22 16:58





Normalerweise sollte das erneute Laden der Konfigurationsdatei eines Dienstes den laufenden Dienst nicht beeinflussen. Dies hängt jedoch davon ab, wie SIGHUP Signal wird verarbeitet.

Wenn bei einem bestimmten Dienst während des Neuladens eine Ausfallzeit auftritt, kann dies umgangen werden, indem derselbe Dienst auf mehreren Servern ausgeführt wird, vorzugsweise unter Verwendung eines Lastenausgleichsmoduls. In diesem Fall können Sie jeweils nur einen Server entfernen und neu starten / neu starten. Dann kann es nach der Bestätigung erneut hinzugefügt werden.


2
2018-04-11 17:24



Obwohl dies nicht direkt die Frage beantwortet, ist dies definitiv ein Best-Practice-Szenario, dem das OP zur Vermeidung von Ausfallzeiten im Allgemeinen folgen würde. - Andrew M.
Details darüber, wie nginx verschiedene Signale verarbeitet: nginx.org/de/docs/control.html - Gnarfoz