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?

Saurav Shah
quelle
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

Hengjie
quelle
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 .

Shiv Kumar Sah
quelle
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.

cnst
quelle
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.

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