nginx Maintenance page

nginx logo

Ihr habt hinter eurem Nginx eine Anwendung bei der von den Entwicklern vergessen worden ist einen Wartungsmodus einzubauen. Nun kommen die Übeltäter zu Euch und wollen eine Vorschaltseite. Wie das geht erfahrt ihr hier!

Inspiriert durch diesen Artikel von Peter Baumgartner https://lincolnloop.com/blog/pro-tip-redirecting-custom-nginx-maintenance-page/ allerdings meckerte unser Loadbalancer am 503 rum den der Webserver logischerweise zurückgegeben hat, also musste ich einen anderen Weg finden, hier ist die Lösung:

In der nginx config werden die Werte für index, try_files und fastcgi_index angepasst. Auserdem wird eine neue Konfigurationsdatei inkludiert, dort wird der Wert für die Variable $my_maintenance gesetzt. Der Inhalt sieht so aus:

set $my_maintenance 1;

Die Konfiugrationsdatei maintenance.conf wird später durch ein bash skript gefüttert welches unser Entwickler ausführen darf:

#!/bin/bash

case $1 in
"on")
ssh webserver1 "echo 'set \$my_maintenance 1;' > /etc/nginx/maintenance/maintenance.conf && service nginx reload"
;;

"off")
ssh webserver1 "echo 'set \$my_maintenance 0;' > /etc/nginx/maintenance/maintenance.conf && service nginx reload"
;;

*)
echo "usage: setmaintenance.sh on|off"
;;
esac

Hier ist die nginx Config unseres vhosts. Sobald $my_maintenance den Wert 1 hat, werden alle Anfragen an maintenance.php weitergeleitet.

server {
listen 80;
server_name test;
root /var/www/test;

error_log /var/www/log/test debug;

include /etc/nginx/maintenance/maintenance.conf;

set $my_index index.php;
set $my_uri $uri;

if ($my_maintenance) {
set $my_index maintenance.php;
set $my_uri /maintenance.php;

set $fastcgi_index maintenance.php;
}

location / {
index $my_index;
try_files $my_uri $my_uri/ $my_index;

location ~ \.php {
try_files $my_uri $my_uri/ $my_index;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/www/sockets/phpfpm-test.socket;
fastcgi_index $my_index;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
}
}
}

Thats it! Fragen bitte in die comments…