Abbiamo un server IIS che ospita centinaia di app Web separate e il server di database fisico che ospita queste app verrà portato offline per manutenzione per un breve periodo (prevediamo che impiegherà meno di 15 minuti).
Durante quel periodo, desideriamo reindirizzare TUTTO il traffico che arriva, per qualsiasi sito Web, a una pagina "al momento in fase di manutenzione".
Mi rendo conto che potrei farlo andando su ogni app Web e impostando una regola di riscrittura IIS che invia l'utente a un'altra pagina per tutte le richieste in quell'app. Ma ci vorrebbe più tempo per farlo che per la manutenzione del database!
Ho provato tre cose, nessuna delle quali ha funzionato:
Regola di riscrittura IIS globale
Ho cercato un modo semplice per applicare una regola a tutti i siti, in un colpo solo - e quindi essere in grado di "annullare" quella regola in un passaggio altrettanto indolore. Finora nessuno dei miei tentativi ha funzionato. Ho provato a mettere questa regola di riscrittura nel mio web.config globale su W: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="redirect all requests" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
</conditions>
<action type="Redirect" url="http://www.somedomain.com/maintenance" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Questo non ha funzionato. Stiamo eseguendo .NET 4.0 a 64 bit in IIS, ma "per ogni evenienza" ho inserito la stessa cosa nei file web.config globali a 32 bit e 2.0 e ancora nessuna modifica.
App_Offline.htm "file speciale"
Un altro suggerimento che ho visto è il file "speciale" app_offline.htm , ma siamo tornati allo stesso problema che impiega più tempo a distribuire questo file nella radice dell'app di tutte le nostre app di quanto non farebbe effettivamente la manutenzione.
Sito "Siamo offline" in IIS
Tutti i nostri siti sono configurati in IIS con un singolo IP. Questo funziona per noi anche senza SNA perché tutte le nostre app condividono un singolo certificato SSL (è un UCC). Una cosa che mi è venuta in mente è stata che forse avrei potuto configurare un sito in IIS che corrispondesse a tutto il traffico verso l'IP che stiamo usando e non specificare un valore di intestazione host. La speranza era che potessi dargli una "precedenza" più elevata e che, una volta avviato, avrebbe abbinato tutto il traffico a quell'IP, prima che uno qualsiasi degli altri siti avesse la possibilità di corrispondere. Potrei impostare quel sito per servire la stessa pagina per tutte le richieste, indipendentemente dall'URL della richiesta.
Avviare quel sito quando sottoposto a manutenzione e arrestarlo al termine.
Ma non sono riuscito a farlo funzionare, dato che IIS sembra abbinare una richiesta HTTP a un sito più specifico prima di meno specifico. Pertanto, omettendo un valore di intestazione host per questo sito "comunica agli utenti che non siamo in linea", non è stato possibile trovare una corrispondenza a meno che la richiesta non avesse un valore di intestazione host corrispondente a un altro sito. Il che ci riporta allo stesso problema di dover andare manualmente a ciascuna app Web ed eseguire un'azione per portarla offline e poi rimetterla online quando abbiamo finito con la manutenzione
C'è un modo semplice per raggiungere questo obiettivo? Sembrerebbe che sicuramente non siamo i primi a riscontrare questo problema.
-Josh