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
Antworten:
Ich würde mit Ihrem dritten Ansatz
"We're offline" Site in IIS
fortfahren und sagen, dass Sie ihn benannt habenOffline
. 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:
Jetzt können Sie alle Websites außer der Offline-Site stoppen:
Wenn der SQL-Server gesichert ist, starten Sie sie erneut:
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.
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.
quelle
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.
quelle
Installieren Sie Apache und erstellen Sie einen virtuellen Host wie folgt
path\to\apache\conf\extra\httpd-vhosts.conf
: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
quelle
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:
quelle