Mamy serwer IIS, który obsługuje setki osobnych aplikacji internetowych, a fizyczny serwer bazy danych, który obsługuje te aplikacje, zostanie wyłączony z powodu konserwacji na krótki czas (spodziewamy się, że zajmie to mniej niż 15 minut).
W tym okresie chcemy przekierować CAŁY ruch przychodzący z dowolnej witryny na stronę „Jesteśmy w trakcie konserwacji”.
Zdaję sobie sprawę, że mógłbym to zrobić, przechodząc do każdej aplikacji sieci Web i konfigurując regułę przepisywania IIS, która wysyła użytkownika na inną stronę dla wszystkich żądań w tej aplikacji. Ale zajęłoby nam to więcej czasu niż utrzymanie bazy danych!
Próbowałem trzech rzeczy, z których żadna nie zadziałała:
Globalna reguła przepisywania IIS
Szukałem prostego sposobu na zastosowanie reguły do wszystkich witryn za jednym zamachem - a następnie móc „cofnąć” tę regułę w jednym równie bezbolesnym kroku. Jak dotąd żadna z moich prób się nie udała. Próbowałem umieścić tę regułę przepisywania w moim globalnym pliku web.config pod adresem 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>
To nie zadziałało. Używamy .NET 4.0 64-bitowego w IIS, ale „na wszelki wypadek” umieszczam to samo 32-bitowe i globalne pliki web.config w wersji 2.0 i nadal nie mam zmian.
App_Offline.htm „plik specjalny”
Inną sugestią, którą widziałem, jest „specjalny” plik app_offline.htm , ale wróciliśmy z tym samym problemem, że wdrażanie tego pliku w katalogu głównym wszystkich naszych aplikacji trwa dłużej niż w rzeczywistości.
Witryna „Jesteśmy offline” w usługach IIS
Wszystkie nasze witryny są skonfigurowane w IIS z jednym adresem IP. Działa to dla nas nawet bez SNA, ponieważ wszystkie nasze aplikacje współużytkują jeden certyfikat SSL (jest to UCC). Jedną rzeczą, która przyszła mi do głowy, było to, że być może mógłbym skonfigurować witrynę w IIS, która dopasowała cały ruch do używanego adresu IP i nie określiła wartości nagłówka hosta. Miałem nadzieję, że mogę dać mu wyższy „priorytet” i że po uruchomieniu dopasuje cały ruch do tego adresu IP, zanim jakakolwiek inna strona będzie miała szansę się dopasować. Mógłbym ustawić tę witrynę, aby wyświetlała tę samą stronę dla wszystkich żądań, niezależnie od adresu URL żądania.
Uruchom tę witrynę podczas konserwacji i zatrzymaj po zakończeniu.
Ale nie udało mi się też tego uruchomić, ponieważ IIS wydaje się dopasowywać żądanie HTTP do bardziej konkretnej witryny, zanim będzie mniej szczegółowe. Tak więc, pomijając wartość nagłówka hosta dla tej witryny „Powiedz użytkownikom, że jesteśmy offline”, nie została dopasowana, chyba że żądanie nie zawierało wartości nagłówka hosta, która pasowałaby do innej witryny. Co sprawia, że wracamy do tego samego problemu, że musimy ręcznie przejść do każdej aplikacji sieci web i wykonać działanie, aby przełączyć ją w tryb offline, a następnie przełączyć z powrotem do trybu online, gdy zakończy się konserwacja
Czy istnieje prosty sposób na osiągnięcie tego? Wydaje się, że z pewnością nie jesteśmy pierwszymi, którzy napotykają ten problem.
-Josh