Una pagina di manutenzione che restituisce 200 dice ai motori di ricerca che tutto il tuo sito adesso è una pagina con scritto «torniamo presto», e loro la indicizzeranno. La risposta giusta è 503 con un'intestazione Retry-After, che significa temporaneamente non disponibile, ripassa più tardi — e non costa niente.

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

Un interruttore basato su un file significa nessun ricaricamento, nessuna modifica alla configurazione, e si può girare da uno script di rilascio.

Fai entrare te stesso

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; }
Senza un'eccezione non puoi provare la correzione che stai rilasciando, e la reazione abituale è spegnere la modalità manutenzione mentre il sito è ancora rotto. Metti dentro il tuo indirizzo prima di averne bisogno.

Che cosa dovrebbe dire la pagina

  • Che è una cosa pianificata, e quando il sito torna — un orario vero, non «a breve».
  • Un modo per raggiungerti che non dipenda dal sito.
  • Nessuna dipendenza dall'applicazione: un file statico con il CSS dentro.

Verificala

curl -sSI https://yourdomain.com/ | grep -E '^HTTP|retry-after'
# HTTP/2 503
# retry-after: 3600
Per un rilascio che dura pochi secondi non usare affatto la modalità manutenzione: costruisci in una cartella nuova e sposta un collegamento simbolico. Nessuno vede niente — vedi Rilasciare con uno scambio atomico.