Tymczasowo przekieruj * wszystkie * żądania HTTP / HTTPS w IIS na stronę „konserwacji serwera”


10

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


Jedną z opcji byłoby zainstalowanie instancji apache lub innego serwera WWW i skonfigurowanie w nim przepraszającej witryny. Następnie, gdy nadejdzie czas, zatrzymaj usługi IIS i uruchom apache, aby obsłużył wszystkie żądania.
phoebus

Zwykle robimy to przy okazji, aby mieć przykro strony na urządzeniu przed serwerem, np. Moduł równoważenia obciążenia.
phoebus

Odpowiedzi:


6

Wybrałbym twoje trzecie podejście "We're offline" Site in IIS, powiedz, że nazwałeś go Offline, jeśli nie ma określonego nagłówka hosta, będzie obsługiwał wszystkie żądania nie odebrane przez żadną z innych witryn, które mają pasujący nagłówek hosta. Aby temu zapobiec, wystarczy zatrzymać wszystkie inne strony.

Zakładając, że masz zainstalowane skrypty IIS, otwórz podwyższoną wersję PowerShell:

import-module webadministration

teraz możesz zatrzymać wszystkie witryny z wyjątkiem offline:

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

kiedy SQL-Server jest ponownie uruchomiony, uruchom go ponownie:

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

Jeśli masz również witryny FTP, polecenia będą wyświetlać błąd, ponieważ nie możesz potokować witryny FTP do polecenia cmdlet Stop-WebSite, ale nadal działa ona dla wszystkich stron internetowych.

Jeśli masz witryny, które normalnie nie działają, musisz je wykluczyć w drugim poleceniu, takim jak:

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

Jeśli nie masz zainstalowanych poleceń cmdlet programu PowerShell dla IIS, możesz użyć appcmd.exe, aby zrobić to samo, ale nie używałem tego od lat.


2

Wszystkie nasze witryny są skonfigurowane w IIS z jednym adresem IP.

1) weź stary pulpit, uruchom dystrybucję linuksa na żywo, nadaj mu ten sam adres IP co pole IIS, nie podłączaj go do sieci

2) odpal nginx na Live Linuxie i ustaw stronę przestoju, jak chcesz, przetestuj ją, używając przełącznika / koncentratora offline podłączonego do twojego laptopa

3) odłącz kabel ethernetowy IIS box i podłącz go do live boxu Linux.

4) wyczyść pamięć podręczną addr mac na przełączniku (lub zasilaniu rolki). Twoja witryna przestoju jest już aktywna.


0

Zainstaluj Apache i utwórz wirtualny host w następujący sposób path\to\apache\conf\extra\httpd-vhosts.conf:

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

    # Other directives here
</VirtualHost>

Następnie w katalogu głównym dokumentu określonym w powyższym ustawieniu utwórz plik index.html z komunikatem offline.

Następujący krok jest bardzo ważny, musisz zatrzymać wszystkie usługi, które mogą korzystać z portu 80 przed uruchomieniem Apache. Listę większości z nich można znaleźć pod tym linkiem


0

Wiem, że to stare, ale musiałem to zrobić na starym pudełku R2 z Windows 2008. To jest więcej odpowiedzi na tytuł pytania; jeśli chodzi o szczegóły pytania, jest to po prostu jedno podejście do skonfigurowania witryny „ Jesteśmy offline w IIS”.

Nie opiera się to na niczym innym niż IIS i statycznym HTML. Funkcja „HTTP Redirect” IIS nie obsługuje tego, co chcesz, ale istnieje inny sposób na jego symulację. Wystarczy zmienić wszystkie „Strony błędów” witryny, aby wskazywały stronę konserwacji. Tak, działa to tylko wtedy, gdy można korzystać z całej „witryny” w IIS.

W moim przypadku witryna ma pojedynczy plik „default.htm” w folderze głównym (np. C: \ InetPub \ wwwroot). Dlatego wszystkie „Strony błędów” są skonfigurowane do „Wykonaj adres URL w tej witrynie” i użyj ścieżki „/default.htm”. Ponieważ w pliku używam bezwzględnych adresów URL (tzn. Zaczynających się od „/”), jego zawartość działa poprawnie w przeglądarce, bez względu na to, jaki publiczny adres URL wydaje się być.

Ostatecznym wynikiem tej konfiguracji są wszelkie / wszystkie żądania skierowane do witryny, które obsługują treść mojej strony serwisowej. Nie ma znaczenia, jakie jest żądanie.

Należy również pamiętać, że IIS wpłynie na tę zmianę, generując plik web.config w folderze głównym. Oto, co dla mnie stworzył:

 <?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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.