Nginx bietet, wie ich finde, eine ziemlich versteckte Möglichkeit ein Upgrade ohne eine einzige HTTP Verbindung zu verlieren durchzuführen.

Sobald die neue Version von Nginx installiert ist sollte man einen Konfigurationstest durchführen:

$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Anschließend gilt es die laufende Prozess ID herauszufinden:

$ cat /var/run/nginx.pid
3883

In diesem Fall lautet diese 3883. Jetzt kommt der eigentliche Trick. Anstatt wie gewohnt einfach den alten Prozess zu beenden schicken wir diesem das USR2 Signal:

$ kill -USR2 3883

Dadurch wird nun neben dem vorhandenen Prozess ein zweiter Nginx Master Prozess gestartet. Beide liefern nun Webseiten aus.

Jetzt wird es Zeit den alten Prozess in den Ruhestand zu schicken. Anstatt diese nun einfach zu beenden, geben wir diesem die Möglichkeit alle Worker Prozesse erst sauber runterzufahren.

$ kill -WINCH 3883

Jetzt sollte man sich ein wenig in Geduld üben und warten bis alle Worker Prozesse beendet sind. Sollte sich nun herausstellen das die neue Version einen Fehler hat, könnte man den alten Worker Prozess mit dem “HUP” Signal veranlassen wieder seinen Dienst aufzunehmen.

Sollte jedoch alles wie gewünscht funktionieren räumen wir noch den alten Master weg:

$ kill -QUIT 24484

In diesem Sinne: Happy Upgrading :-)