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


10

Wir haben einen IIS-Server, auf dem Hunderte separater Webanwendungen gehostet werden, und der physische Datenbankserver, auf dem diese Apps gehostet werden, wird für kurze Zeit zur Wartung offline geschaltet (wir erwarten, dass dies weniger als 15 Minuten dauert).

Während dieses Zeitraums möchten wir den gesamten eingehenden Datenverkehr für jede Website auf die Seite "Wir werden derzeit gewartet" umleiten.

Mir ist klar, dass ich dies tun kann, indem ich zu jeder Web-App gehe und eine IIS-Umschreiberegel einrichte, die den Benutzer für alle Anforderungen in dieser App auf eine andere Seite sendet. Aber das würde länger dauern als die Datenbankwartung!

Ich habe drei Dinge ausprobiert, von denen keines funktioniert hat:

Globale IIS-Rewrite-Regel

Ich habe nach einer einfachen Möglichkeit gesucht, eine Regel auf einen Schlag auf alle Websites anzuwenden - und diese Regel dann in einem ebenso schmerzlosen Schritt "rückgängig machen" zu können. Bisher hat keiner meiner Versuche funktioniert. Ich habe versucht, diese Umschreiberegel in meine globale web.config unter W: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config einzufügen:

<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 führen .NET 4.0 64-Bit in IIS aus, aber "nur für den Fall" habe ich das Gleiche in die 32-Bit- und 2.0-globalen web.config-Dateien eingefügt und immer noch keine Änderung vorgenommen.

App_Offline.htm "spezielle Datei"

Ein weiterer Vorschlag, den ich gesehen habe, ist die "spezielle" Datei "app_offline.htm". Wir haben jedoch das gleiche Problem, dass die Bereitstellung dieser Datei im App-Stammverzeichnis aller unserer Apps länger dauert als die eigentliche Wartung.

Site "Wir sind offline" in IIS

Alle unsere Sites werden in IIS mit einer einzigen IP eingerichtet. Dies funktioniert für uns auch ohne SNA, da alle unsere Apps ein einziges SSL-Zertifikat gemeinsam nutzen (es ist ein UCC). Eine Sache, die mir einfiel, war, dass ich möglicherweise eine Site in IIS einrichten konnte, die den gesamten Datenverkehr mit der von uns verwendeten IP übereinstimmte und keinen Host-Header-Wert angab. Die Hoffnung war, dass ich ihm eine höhere "Priorität" geben könnte und dass es beim Start den gesamten Datenverkehr mit dieser IP abgleichen würde, bevor eine der anderen Sites eine Chance hatte, übereinzustimmen. Ich könnte diese Site so einrichten, dass sie für alle Anfragen dieselbe Seite bereitstellt, unabhängig von der Anforderungs-URL.

Starten Sie diese Site, wenn Sie Wartungsarbeiten durchführen, und beenden Sie sie, wenn Sie fertig sind.

Aber ich konnte dies auch nicht zum Laufen bringen, da IIS eine HTTP-Anforderung an eine spezifischere Site anzupassen scheint, bevor sie weniger spezifisch ist. Wenn Sie also einen Host-Header-Wert für diese Site "Benutzer mitteilen, dass wir offline sind" weglassen, wurde dieser nicht abgeglichen, es sei denn, die Anforderung hatte keinen Host-Header-Wert, der mit einem anderen Site übereinstimmte. Damit haben wir wieder das gleiche Problem: Wir müssen manuell zu jeder Web-App gehen und eine Aktion ausführen, um sie offline zu schalten 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


Eine Möglichkeit wäre, eine Instanz von Apache oder einen anderen Webserver zu installieren und Ihre traurige Site darin einzurichten. Wenn es soweit ist, stoppen Sie IIS, starten Sie Apache und lassen Sie es alle Anforderungen bearbeiten.
Phoebus

Die Art und Weise, wie wir dies normalerweise tun, besteht darin, eine traurige Seite auf einem Gerät vor dem Server zu haben, z. B. einen Load Balancer.
Phoebus

Antworten:


6

Ich würde mit Ihrem dritten Ansatz "We're offline" Site in IISfortfahren und sagen, dass Sie ihn benannt haben Offline. Wenn kein Host-Header angegeben ist, werden alle Anforderungen bearbeitet, die von keiner der anderen Sites mit einem passenden Host-Header erfasst wurden. Um dies zu verhindern, stoppen Sie einfach alle anderen Websites.

Angenommen, Sie haben IIS Scripting installiert, öffnen Sie eine PowerShell mit erhöhten Rechten:

import-module webadministration

Jetzt können Sie alle Websites außer der Offline-Site stoppen:

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

Wenn der SQL-Server gesichert ist, starten Sie sie erneut:

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

Wenn Sie auch über FTP-Sites verfügen, wird in den Befehlen ein Fehler angezeigt, da Sie eine FTP-Site nicht an ein Cmdlet von Stop-WebSite weiterleiten können, dies jedoch weiterhin für alle Websites funktioniert.

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 appcmd.exe verwenden, um dasselbe zu tun. Ich habe dies jedoch seit Jahren nicht mehr verwendet.


2

Alle unsere Sites werden in IIS mit einer einzigen IP eingerichtet.

1) Nehmen Sie einen alten Desktop, führen Sie die Live-Linux-Distribution aus, geben Sie ihm dieselbe IP-Adresse wie die IIS-Box und verbinden Sie ihn nicht mit dem Netzwerk

2) Starten Sie Nginx auf einer Live-Linux-Box und erstellen Sie die Seite mit den Ausfallzeiten nach Ihren Wünschen. Testen Sie sie mithilfe eines Offline-Switches / Hubs, der an Ihren Laptop angeschlossen ist

3) Ziehen Sie das Ethernet-Kabel der IIS-Box heraus und stecken Sie es in die Live-Linux-Box.

4) Leeren Sie den Mac-Adr-Cache auf dem Switch (oder rollen Sie die Stromversorgung). Ihre Ausfallzeit-Site ist jetzt aktiv.


0

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

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

    # Other directives here
</VirtualHost>

Erstellen Sie dann im in der obigen Einstellung angegebenen Dokumentstamm eine index.html-Datei mit einer Offline-Nachricht.

Der folgende Schritt ist sehr wichtig. Sie müssen alle Dienste stoppen, die möglicherweise Port 80 verwenden, bevor Sie Apache ausführen. Eine Liste der meisten von ihnen finden Sie unter diesem Link


0

Ich weiß, dass dies alt ist, aber ich musste dies nur auf einer alten Windows 2008 R2-Box tun. Dies ist eine Antwort mehr für den Fragentitel; In Bezug auf das Fragendetail ist es dann einfach ein Ansatz zum Einrichten einer " Wir sind Offline- Site in IIS".

Dies hängt nicht mehr als von IIS und statischem HTML ab. Die "HTTP Redirect" -Funktion von IIS verarbeitet nicht das, was Sie möchten, aber es gibt eine andere Möglichkeit, dies zu simulieren. Ändern Sie einfach alle "Fehlerseiten" für die Site, um auf die Wartungsseite zu verweisen. Ja, dies funktioniert nur, wenn Sie eine gesamte "Site" in IIS verwenden können.

In meinem Fall hat die Site eine einzelne "default.htm" -Datei in ihrem Stammordner (z. B. c: \ InetPub \ wwwroot). Daher sind alle "Fehlerseiten" so konfiguriert, dass sie "eine URL an dieser Site ausführen" und den Pfad "/default.htm" verwenden. Da ich in der Datei absolute URLs verwende (dh mit "/" beginne), wird deren Inhalt im Browser korrekt ausgeführt, unabhängig davon, wie die öffentliche URL aussieht.

Das Nettoergebnis dieser Konfiguration sind alle Anfragen an die Site, die dem Inhalt meiner Wartungsseite dienen. Es spielt keine Rolle, was die Anfrage ist.

Beachten Sie außerdem, dass IIS diese Änderung beeinflusst, indem Sie eine web.config-Datei im Stammordner generieren. 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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.