Frage Umleiten Sie vorübergehend * alle * HTTP / HTTPS-Anforderungen in IIS auf eine Seite "Serverwartung"


Wir haben einen IIS-Server, der hunderte von separaten Web-Apps hostet, und der physische Datenbankserver, der diese Apps hostet, wird für kurze Zeit offline genommen (wir erwarten, dass er weniger als 15 Minuten dauert).

Während dieses Zeitraums möchten wir den ALLEN Verkehr, der für jede Website eingeht, auf die Seite "Wir werden gerade gewartet" umleiten.

Ich weiß, dass ich dies tun kann, indem ich zu jeder Web-App gehe und eine IIS-Rewrite-Regel aufstelle, die den Benutzer für alle Anfragen in dieser App auf eine andere Seite schickt. Aber das würde länger dauern als die Wartung der Datenbank!

Ich habe drei Dinge ausprobiert, von denen keiner funktioniert:

Globale IIS-Rewrite-Regel

Ich habe nach einer einfachen Methode gesucht, um eine Regel anzuwenden alles Orte, auf einen Schlag - und dann in der Lage sein, diese Regel in einem ebenso schmerzlosen Schritt "rückgängig zu machen". Bisher hat keiner meiner Versuche funktioniert. Ich habe versucht, diese Umschreibregel in meine globale web.config unter W: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config zu schreiben:

<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>

Das hat nicht funktioniert. Wir laufen mit .NET 4.0 64 Bit in IIS, aber "nur für den Fall" habe ich die 32-Bit- und 2.0-globalen web.config-Dateien gleich und unverändert unverändert gelassen.

App_Offline.htm "spezielle Datei"

Ein anderer Vorschlag, den ich gesehen habe, ist der app_offline.htm "spezielle" Datei, aber wir haben wieder das gleiche Problem, dass es länger dauert, diese Datei im App-Stamm aller unserer Apps bereitzustellen, als dies tatsächlich für die Wartung der Fall wäre.

"Wir sind offline" Site in IIS

Alle unsere Websites sind in IIS mit einer einzigen IP-Adresse eingerichtet. Das funktioniert auch ohne SNA für uns, weil alle unsere Apps ein einziges SSL-Zertifikat teilen (es ist ein UCC). Eine Sache, die mir in den Sinn kam, war, dass ich vielleicht eine Site in IIS einrichten konnte, die den gesamten Traffic mit der von uns verwendeten IP-Adresse übereinstimmte nicht Geben Sie einen Host-Header-Wert an. Die Hoffnung war, dass ich ihm eine höhere "Präzedenz" geben könnte und dass es, wenn es gestartet wird, den gesamten Verkehr mit dieser IP abgleichen würde, bevor irgendeine der anderen Seiten eine Chance hätte, übereinzustimmen. Ich könnte diese Seite einrichten, um die gleiche Seite für alle Anfragen zu bedienen, unabhängig von der Anfrage-URL.

Starten Sie diese Website, wenn Wartungsarbeiten durchgeführt werden, und beenden Sie sie, wenn Sie fertig sind.

Aber ich konnte das nicht funktionieren, da IIS scheint, eine HTTP-Anfrage mit einer spezifischeren Seite zu verbinden, bevor sie weniger spezifisch ist. Durch das Weglassen eines Host-Header-Werts für diese Website "Tell users we're offline" wurde keine Übereinstimmung erzielt, es sei denn, die Anforderung hatte keinen Host-Header-Wert, der mit einer anderen Site übereinstimmte. Das bringt uns zu dem gleichen Problem zurück, dass wir manuell zu jeder Web-App gehen müssen und eine Aktion ausführen müssen, um sie offline zu nehmen, und sie dann wieder online zu stellen, wenn wir mit der Wartung fertig sind

Gibt es einen einfachen Weg, dies zu erreichen? Es scheint, dass wir sicherlich nicht die ersten sind, die auf dieses Problem stoßen.

- Josh


9
2017-11-15 22:48


Ursprung


Eine Option wäre, eine Apache-Instanz oder einen anderen Webserver zu installieren und Ihre eigene Website einzurichten. Dann, wenn die Zeit gekommen ist, stoppe IIS und starte Apache und lasse es alle Anfragen behandeln. - phoebus
Die Art und Weise, wie wir dies gemeinsam tun, ist eine leidvolle Seite auf einem Gerät vor dem Server, z. ein Lastenausgleicher. - phoebus


Antworten:


Ich würde mit deinem dritten Ansatz gehen "We're offline" Site in IIS, sag du nennst es OfflineWenn kein Hostheader angegeben ist, werden alle Anfragen bedient, die nicht von anderen Sites mit einem übereinstimmenden Hostheader abgerufen wurden. Um dies zu verhindern, stoppen Sie einfach alle anderen Sites.

Angenommen, Sie haben IIS Scripting installiert, öffnen Sie eine erweiterte PowerShell:

import-module webadministration

Jetzt können Sie alle Websites mit Ausnahme der Offline-Website stoppen:

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

Wenn der SQL-Server wieder verfügbar ist, starten Sie ihn erneut:

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

Wenn Sie auch über FTP-Sites verfügen, wird bei den Befehlen ein Fehler angezeigt, da Sie keine FTP-Site an ein Stop-WebSite-Cmdlet weiterleiten können, aber es funktioniert weiterhin für alle Websites.

Wenn Sie Websites haben, die normalerweise nicht ausgeführt werden, müssen Sie sie im zweiten Befehl ausschließen, z.

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

Wenn Sie die PowerShell-Cmdlets für IIS nicht installiert haben, können Sie mit appcmd.exe dasselbe tun, ich habe das jedoch seit Jahren nicht mehr verwendet.


6
2017-11-16 10:09



Ich denke, das wird für uns funktionieren. Vielen Dank! - Josh


Alle unsere Websites sind in IIS mit einer einzigen IP-Adresse eingerichtet.

1) Nehmen Sie einen alten Desktop, führen Sie Live-Linux-Distribution, geben Sie die gleiche IP-Adresse wie die IIS-Box, tun nicht verbinde es mit dem Netzwerk

2) Starten Sie nginx auf der Live-Linux-Box, und machen Sie die Ausfallzeit-Seite wie Sie es wollen, testen Sie es mit einem Offline-Switch / Hub, der mit Ihrem Laptop verbunden ist

3) Ziehen Sie das IIS-Box-Ethernetkabel ab und stecken Sie es in die Linux-Live-Box.

4) Löschen Sie den Mac-Addr-Cache auf dem Switch (oder schalten Sie ihn ein). Ihre Ausfallzeit-Site ist jetzt live.


2
2017-11-16 01:12





Installieren Sie Apache und erstellen Sie einen virtuellen Host wie den folgenden in path\to\apache\conf\extra\httpd-vhosts.conf:

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

    # Other directives here
</VirtualHost>

Erstellen Sie dann in dem Dokumentstamm, der in der obigen Einstellung angegeben wird, eine Index.html-Datei mit einer Offline-Nachricht.

Der folgende Schritt ist sehr wichtig. Sie müssen alle Dienste beenden, die Port 80 verwenden, bevor Sie Apache ausführen. Sie können eine Liste der Mehrheit von ihnen an finden dieser Link


0
2018-03-28 00:48





Ich weiß, das ist alt, aber ich musste das nur auf einer alten Windows 2008 R2-Box machen. Dies ist eine Antwort mehr für den Titel der Frage; In Bezug auf das Fragedetail ist es dann nur ein Ansatz, um ein "Wir sind offline Website in IIS ".

Dies beruht nicht auf etwas mehr als IIS und statischem HTML. Die "HTTP Redirect" -Funktion von IIS kann nicht mit Ihren Anforderungen umgehen, aber es gibt eine andere Möglichkeit, sie zu simulieren. Ändern Sie einfach alle "Fehlerseiten" für die Site, um auf die Wartungsseite zu zeigen. Ja, das funktioniert nur, wenn Sie eine vollständige "Site" in IIS verwenden können.

In meinem Fall hat die Site eine einzelne Datei "default.htm" in ihrem Stammordner (z. B. c: \ InetPub \ wwwroot). So alles der "Fehlerseiten" sind auf "URL an dieser Site ausführen" konfiguriert und verwenden den Pfad "/default.htm". Da ich absolute URLs (d. H. Beginnend mit "/") in der Datei verwende, wird ihr Inhalt im Browser korrekt ausgeführt, unabhängig davon, wie die öffentliche URL aussieht.

Das Ergebnis dieser Konfiguration sind alle / alle Anforderungen an die Website, die den Inhalt meiner Wartungsseite bereitstellen. Es ist egal, was die Anfrage ist.

Beachten Sie außerdem, dass IIS diese Änderung durch das Generieren einer Datei Web.config in dem Stammordner beeinflusst. Das hat es für mich geschaffen:

 <?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>

0
2017-12-18 21:19