Reindirizzare temporaneamente * tutte * le richieste HTTP / HTTPS in IIS a una pagina di "manutenzione del server"


10

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


Un'opzione sarebbe quella di installare un'istanza di apache o un altro server Web e impostare il tuo sito di scusa in esso. Quindi, quando arriva il momento, interrompere IIS e avviare apache e far sì che gestisca tutte le richieste.
phoebus,

Il modo in cui lo facciamo comunemente è quello di avere una pagina spiacevole su un dispositivo di fronte al server, ad esempio un bilanciamento del carico.
phoebus il

Risposte:


6

Andrei con il tuo terzo approccio "We're offline" Site in IIS, diciamo che lo hai chiamato Offline, se non ha alcuna intestazione host specificata, servirà tutte le richieste non raccolte da nessuno degli altri siti che hanno un'intestazione host corrispondente. Per evitare ciò, basta interrompere tutti gli altri siti.

Supponendo che IIS Scripting sia installato, aprire un PowerShell elevato:

import-module webadministration

ora puoi fermare tutti i siti tranne quello offline:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Stop-WebSite

quando si esegue il backup di SQL Server, riavviarli:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Start-WebSite

Se si dispone anche di siti FTP, i comandi mostreranno un errore perché non è possibile reindirizzare un sito FTP a un cmdlet Stop-WebSite, ma funziona comunque per tutti i siti Web.

Se hai siti che normalmente non vengono eseguiti, devi escluderli nel secondo comando, come:

Where {$_.Name -ne "Offline" -and $_.Name -ne "foobar.com"}

Se non hai installato i cmdlet di PowerShell per IIS, puoi usare appcmd.exe per fare lo stesso, ma non lo uso da anni.


2

Tutti i nostri siti sono configurati in IIS con un singolo IP.

1) prendi un vecchio desktop, esegui live linux distro, dagli lo stesso ip della scatola IIS, non collegalo alla rete

2) avvia nginx su live linux box e crea la pagina di downtime come preferisci, testala usando uno switch / hub offline collegato al tuo laptop

3) scollegare il cavo ethernet box IIS e collegarlo a live box linux.

4) cancella la cache di mac addr sullo switch (o avvia la corrente). il tuo sito di downtime è ora attivo.


0

Installa Apache e crea un host virtuale come il seguente in path\to\apache\conf\extra\httpd-vhosts.conf:

<VirtualHost *:80>
    DocumentRoot C:/Apache/htdocs
    ServerName anyname.net

    # Other directives here
</VirtualHost>

Quindi nella radice del documento specificata nell'impostazione precedente, creare un file index.html con un messaggio offline.

Il passaggio seguente è molto importante, è necessario arrestare tutti i servizi che potrebbero utilizzare la porta 80 prima di eseguire Apache. È possibile trovare un elenco della maggior parte di questi a questo link


0

So che è vecchio, ma ho dovuto farlo su un vecchio box Windows 2008 R2. Questa è una risposta in più per il titolo della domanda; per quanto riguarda i dettagli della domanda, si tratta semplicemente di un approccio alla creazione di un " sito non in linea in IIS".

Questo non si basa su altro che IIS e HTML statico. La funzionalità "Reindirizzamento HTTP" di IIS non gestisce ciò che desideri, ma esiste un altro modo per simularlo. Basta cambiare tutte le "Pagine di errore" affinché il sito faccia riferimento alla pagina di manutenzione. Sì, funziona solo se è possibile utilizzare un intero "sito" in IIS.

Nel mio caso, il sito ha un singolo file "default.htm" nella sua cartella principale (es. C: \ InetPub \ wwwroot). Quindi tutte le "Pagine di errore" sono configurate su "Esegui un URL su questo sito" e usano il percorso "/default.htm". Dal momento che uso URL assoluti (cioè che iniziano con "/") nel file, il suo contenuto viene eseguito correttamente nel browser, indipendentemente dall'URL pubblico.

Il risultato netto di questa configurazione è qualsiasi / tutte le richieste al sito servono il contenuto della mia pagina di manutenzione. Non importa quale sia la richiesta.

Inoltre, tenere presente che IIS influirà su questa modifica generando un file web.config nella cartella principale. Questo è ciò che ha creato per me:

 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <system.webServer>
         <httpErrors>
             <remove statusCode="502" subStatusCode="-1" />
             <remove statusCode="501" subStatusCode="-1" />
             <remove statusCode="500" subStatusCode="-1" />
             <remove statusCode="412" subStatusCode="-1" />
             <remove statusCode="406" subStatusCode="-1" />
             <remove statusCode="405" subStatusCode="-1" />
             <remove statusCode="404" subStatusCode="-1" />
             <remove statusCode="403" subStatusCode="-1" />
             <remove statusCode="401" subStatusCode="-1" />
             <error statusCode="401" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="403" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="404" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="405" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="406" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="412" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="500" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="501" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="502" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
         </httpErrors>
     </system.webServer>
 </configuration>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.