Nginx Config wird ohne Ausfallzeit neu geladen


123

Ich benutze Nginx als Reverse-Proxy. Immer wenn ich die Konfiguration dafür 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?


1
Sind das Kommandozeilenbefehle? Ich habe noch nie jemanden gesehen, der einen ganzen sudo-Befehl in solche Anführungszeichen gesetzt hat. Möglicherweise ist dies nicht erforderlich.
Brianmearns

4
Nur ein allgemeiner Kommentar: Ich denke, die Standard- / empfohlene Vorgehensweise ist, einen weichen / symbolischen Link für Ihre Site-Konfiguration unter zu erstellen sites-enabled, nicht zu kopieren. Nicht auf Ihr spezielles Problem bezogen, aber Sie möchten sich vielleicht darum kümmern.
Brianmearns

1
Sie sollten keine Ausfallzeiten haben. kill HUPist die Möglichkeit, ein elegantes Neuladen in Nginx durchzuführen.
Jonathan Vanasco

Antworten:


180

Führen Sie service nginx reloadoder aus/etc/init.d/nginx reload

Die Konfiguration wird ohne Ausfallzeit im laufenden Betrieb neu geladen. Wenn Sie ausstehende Anforderungen haben, gibt es verweilende Nginx-Prozesse, die diese Verbindungen behandeln, bevor sie abstürzen. Dies ist eine äußerst elegante Methode, um Konfigurationen neu zu laden.

Manchmal möchten Sie vielleicht mit voranstellen sudo


10
Beide sollten genau das tun, was in der Frage steht: SIGHUPAn den Nginx-Master-Prozess senden . Es sollte keinen Unterschied geben. nginx.org/en/docs/control.html
Gnarfoz

Wenn ich den Befehl unter CentOS absetze, wird immer wieder "Usage /etc/init.d/nginx (start..stop ... restart..reload)" angezeigt, und genau so habe ich ihn verwendet. In der Datei /init.d/nginx habe ich kill -HUP cat $PIDFILE|| gefunden echo -n "kann nicht nachladen"
Mashup

1
Weißt du, was der Unterschied zwischen service nginx reloadund ist nginx -s reload? Wenn ich das erstere ausführe, erhalte ich die folgende Ausgabe:, Reloading nginx configuration: nginx.aber meine Änderungen werden nicht aktualisiert. Wenn ich Letzteres ausführe, erhalte ich keine Ausgabe, aber meine Änderungen werden wiedergegeben.
Ryan Quinn

Ich habe das gerade versucht, nachdem ich eine log_not_foundDirektive hinzugefügt hatte, aber festgestellt, dass ich einen Neustart durchführen musste, damit es funktioniert. Ich denke, das Nachladen funktioniert nicht bei allen Anweisungen?
mydoghasworms

81

Lauf /usr/sbin/nginx -s reload

Weitere Befehlszeilenoptionen finden Sie unter http://wiki.nginx.org/CommandLine .


Endlich ein Befehl, der in Debian Jessie funktioniert.
danger89

1
Das ist ein besserer Weg. Weil Ihr Server nicht ausfällt, wenn Ihre Konfigurationen Fehler aufweisen (in diesem Fall werden nur Fehler angezeigt).
Mir-Ismaili

Wenn sich die Standard-PID von Nginx nicht am Standardspeicherort befindet, muss '-p' angegeben werden. dh: `/ opt / gitlab / embedded / sbin / nginx -s reload -p / var / opt / gitlab / nginx`
qxo

9

Nein, Sie sind falsch. Es ist nicht vorgesehen, dass Sie mit dem von Ihnen beschriebenen Verfahren Ausfallzeiten haben. (Nginx kann nicht nur die Konfiguration im laufenden Betrieb ohne Ausfallzeiten neu laden, sondern auch die ausführbare Datei im laufenden Betrieb aktualisieren, immer noch ohne Ausfallzeiten.)

Wenn Sie das Signal gemäß http://nginx.org/docs/control.html#reconfigurationHUP an nginx senden, wird sichergestellt, dass ein ordnungsgemäßer Neustart durchgeführt wird. Wenn die Konfigurationsdateien nicht korrekt sind, wird der gesamte Vorgang abgebrochen. Der Nginx verbleibt wie vor dem Senden des HUPSignals. Zu keinem Zeitpunkt sollten Ausfallzeiten möglich sein.

Damit Nginx die Konfigurationsdatei erneut lesen kann, muss ein HUP-Signal an den Master-Prozess gesendet werden. Der Master-Prozess überprüft zuerst die Gültigkeit der Syntax 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 beibehalten.


2

In der Regel sollte das erneute Laden der Konfigurationsdatei eines Dienstes keine Auswirkungen auf den ausgeführten Dienst haben. Dies hängt jedoch davon ab, wie das SIGHUPSignal verarbeitet wird.

Wenn ein bestimmter Dienst während des erneuten Ladens ausfällt, kann dies umgangen werden, indem derselbe Dienst auf mehreren Servern ausgeführt wird, vorzugsweise mithilfe eines Lastenausgleichs. In diesem Fall können Sie jeweils einen Server herausnehmen und neu laden / neu starten. Anschließend kann es erneut hinzugefügt werden, nachdem bestätigt wurde, dass es in Ordnung ist.


Dies beantwortet die Frage zwar nicht direkt, es handelt sich jedoch definitiv um ein Best-Practice-Szenario, dem das OP folgen sollte, um Ausfallzeiten im Allgemeinen zu vermeiden.
Andrew M.

1
Details darüber, wie Nginx mit verschiedenen Signalen umgeht
Gnarfoz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.