Frage Gibt es eine Möglichkeit zu erkennen, wenn Nginx ein ordnungsgemäßes Herunterfahren abgeschlossen hat?


Ich habe eine Ruby-on-Rails-Anwendung, die auf Passagier und Linux ausgeführt wird, mit einem Haupt-Webserver und mehreren Anwendungsservern. Ich versuche, meinen Bereitstellungsprozess zu aktualisieren, um die durch die Bereitstellung verursachten Ausfallzeiten zu minimieren (oder idealerweise zu entfernen). Die Hauptstraßensperre ist momentan, dass der Passagier etwas Zeit braucht, um neu zu starten (dh die Anwendung neu zu laden). Um das zu umgehen, möchte ich meine Neustarts staffeln, sodass immer nur ein App-Server neu gestartet wird.

Um dies zu erreichen, ohne lange laufende Passagierprozesse zu verlieren, denke ich, dass ich die nginx-Instanz des Anwendungsservers ordnungsgemäß herunterfahren muss, was dazu führt, dass es keine neuen Verbindungen mehr akzeptiert, sondern die bestehenden weiterverarbeitet; Außerdem erkennt HAProxy, dass der Anwendungsserver inaktiv ist, und leitet neue Anforderungen an den anderen Server weiter.

Angenommen, es gibt einen lang andauernden Prozess, bin ich mir nicht sicher, wie ich feststellen kann, wann das ordentliche Herunterfahren abgeschlossen ist, damit ich es wieder starten kann. Da die Abschaltung durch Senden eines Signals (d. H. kill -QUIT $( cat /var/run/nginx.pid )), und der Befehl kill wird sofort zurückkehren, ich kann keine Befehle kombinieren (d. h. kill ... && touch restarted), als die touch Der Befehl wird sofort ausgeführt, selbst wenn nginx das Herunterfahren nicht abgeschlossen hat.

Gibt es einen guten Weg, dies zu tun?


6
2018-02-07 18:55


Ursprung




Antworten:


Was ist mit so etwas?

while [ -n "$(pgrep nginx)" ]
do
  some-stuff  
done

Also wird der pgrep nach jedem nginx-Prozess suchen, und die while-Schleife lässt ihn dort sitzen, bis sie alle weg sind. Sie können etwas ändern, um etwas Nützliches zu tun, wie sleep 1; /etc/init.d/nginx stop, damit es eine Sekunde lang schläft, und versuche dann, nginx mit dem Skript init.d zu stoppen. Sie können auch irgendwo einen Zähler einsetzen, damit Sie die Wühlsignale auslösen können, wenn es zu lange dauert.


7
2018-02-07 19:55



Vielen Dank! Basierend auf dieser Antwort habe ich ein Bash - Skript erstellt, um den anmutigen Neustart für mich durchzuführen (siehe meine Antwort) - Daniel Vandersluis
Wenn Ihr Nginx Proxy ist, der Web-Sockets übergibt, stellen Sie sicher, dass Sie den Prozess, der die Sockets abgehört, abstellen, bevor Sie nginx sogar ordnungsgemäß beenden, sonst wird nginx nie richtig geschlossen und diese Schleife bleibt für immer hängen. - Mahn


Warum nicht die eingebaute Flagge dafür benutzen?

nginx -s quit

lese den zweiten Block wo es diese Flagge erklärt hat ...

http://nginx.org/en/docs/control.html


4
2017-11-18 03:15





Beyogen auf CJCs Antwort, hier ist das Bash-Skript, das ich erstellt habe, falls jemand anderes auf dasselbe Problem stößt:

#!/bin/bash
set -e

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
  echo "This script must be run as root."
  exit
fi

if [ -n "$(pgrep nginx)" -a -f /var/run/nginx.pid ]; then
  PID=$( cat /var/run/nginx.pid )

  # Gracefully shutdown nginx
  kill -QUIT $PID

  # Wait for nginx to stop
  while [ -d "/proc/$PID" -a -f /var/run/nginx.pid ]; do
    sleep 1
  done

  # Restart nginx
  /usr/sbin/service nginx start
else
  echo "nginx is not running."
  exit 1
fi

3
2018-02-07 22:10



Ich würde irgendeine Art von Timer machen, um aus deinem zu entkommen whileSchleife, falls nginx über das Signal ungehorsam ist und nicht etwa eine Minute stirbt. - cjc


Sie können überprüfen, ob / proc / $ (cat /var/run/nginx.pid) / existiert. Oder versuchen Sie, ob /var/run/nginx.pid beim Herunterfahren entfernt wird.


1
2018-02-07 19:02





ps-fC nginx

  Wurzel 7146 1 0 02:19? 00:00:00 nginx: Masterprozess / usr / sbin / nginx
  1. www 7147 7146 0 02:19? 00:00:00 nginx: Arbeiterprozess
  2. www 7148 7146 0 02:19? 00:00:00 nginx: Arbeiterprozess

Wenn Sie also ein Shutdown / Restart-Skript schreiben, das eine Schleife ausführt, bis 7146 in diesem Fall gestorben ist, starten Sie nginx erneut


0
2018-02-08 00:07