Eine Wartungsseite mit Status 200 sagt Suchmaschinen, Ihre gesamte Website sei jetzt eine Seite mit „bald zurück“ — und sie werden das indexieren. Die richtige Antwort ist 503 mit einem Retry-After-Header: vorübergehend nicht verfügbar, komm später wieder — und sie kostet nichts.

Nginx

server {
    # ...
    if (-f /var/www/site/maintenance.on) {
        return 503;
    }

    error_page 503 @maintenance;
    location @maintenance {
        root /var/www/site/public;
        rewrite ^ /maintenance.html break;
        add_header Retry-After 3600 always;
    }
}
sudo touch /var/www/site/maintenance.on     # on
sudo rm /var/www/site/maintenance.on        # off

Ein Schalter über eine Datei heißt: kein Neuladen, keine Konfigurationsänderung, und er lässt sich aus einem Deploy-Skript umlegen.

Lassen Sie sich selbst hinein

set $maint 0;
if (-f /var/www/site/maintenance.on) { set $maint 1; }
if ($remote_addr = 203.0.113.42)   { set $maint 0; }
if ($maint = 1) { return 503; }
Ohne Ausnahme können Sie die Korrektur, die Sie ausrollen, gar nicht testen — und die übliche Reaktion ist, den Wartungsmodus abzuschalten, während die Website noch kaputt ist. Tragen Sie Ihre eigene Adresse ein, bevor Sie sie brauchen.

Was auf der Seite stehen sollte

  • Dass es geplant ist, und wann es wieder da ist — eine echte Uhrzeit, nicht „in Kürze“.
  • Eine Möglichkeit, Sie zu erreichen, die nicht von der Website abhängt.
  • Keine Abhängigkeit von der Anwendung: eine statische Datei mit eingebettetem CSS.

Nachprüfen

curl -sSI https://yourdomain.com/ | grep -E '^HTTP|retry-after'
# HTTP/2 503
# retry-after: 3600
Für ein Deployment, das Sekunden dauert, verwenden Sie gar keinen Wartungsmodus: bauen Sie in ein neues Verzeichnis und legen Sie einen Symlink um. Niemand sieht etwas — siehe Ausrollen mit einem atomaren Umschalter.