Тимчасове переадресація * всіх * HTTP / HTTPS-запитів у IIS на сторінку "обслуговування сервера"


10

У нас є сервер IIS, на якому розміщені сотні окремих веб-додатків, і фізичний сервер баз даних, на якому розміщені ці програми, буде коротким часом відключений для обслуговування (ми очікуємо, що це займе менше 15 хвилин).

У цей період ми хочемо переспрямувати ВСІЙ трафік, який надходить для будь-якого веб-сайту, на сторінку "ми зараз проходимо обслуговування".

Я усвідомлюю, що можу це зробити, перейшовши до кожного веб-програми та встановивши правило перезапису IIS, яке пересилає користувача на іншу сторінку для всіх запитів у цьому додатку. Але це займе нам більше часу, ніж це буде для обслуговування баз даних!

Я спробував три речі, жодна з яких не спрацювала:

Глобальне правило перезапису IIS

Я шукав простий спосіб застосувати правило на всіх сайтах одним махом - і тоді зможу "скасувати" це правило одним не менш безболісним кроком. Поки жодна моя спроба не спрацювала. Я намагався помістити це правило перезапису у свій глобальний web.config на 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>

Це не спрацювало. Ми працюємо .NET 4.0 64 біт в IIS, але "про всяк випадок" я поставив те саме, що 32-бітний і 2.0 глобальні файли web.config, і все ще не змінюється.

App_Offline.htm "спеціальний файл"

Ще одна пропозиція, яку я бачив, - це "спеціальний" файл app_offline.htm , але ми повертаємось до тієї самої проблеми, що потрібно розгорнути цей файл до кореня додатка всіх наших додатків, ніж це було б насправді для обслуговування.

Сайт "Ми в офлайні" в IIS

Всі наші сайти налаштовані в IIS з єдиним IP-адресою. Це працює для нас навіть без СНР, оскільки всі наші додатки мають один сертифікат SSL (це UCC). Одне, що мені прийшло в голову, - це те, що, можливо, я міг налаштувати сайт в IIS, який відповідав би всім трафіку до IP, який ми використовуємо, і не вказав значення заголовка хоста. Сподівалося, що я можу надати йому більш високий "перевагу" і що, коли це буде запущено, він буде співвідносити весь трафік із цією IP-адресою, перш ніж будь-який з інших сайтів мав шанс зіставити. Я міг би налаштувати цей сайт так, щоб він обслуговував одну і ту ж сторінку для всіх запитів, незалежно від URL-адреси запиту.

Почніть цей сайт, коли він проходить технічне обслуговування, і зупиніть його, коли закінчите.

Але я так і не зміг змусити це працювати, оскільки IIS, схоже, відповідає HTTP-запиту більш конкретному сайту перед менш конкретним. Отже, опустивши значення хост-заголовка для цього сайту "скажи користувачам, що ми в офлайні", він не збігався, якщо запит не мав значення заголовка хоста, що відповідало іншому сайту. Що ставить нас назад перед тією самою проблемою, що нам потрібно вручну перейти до кожного веб-додатка та виконати дію, щоб зняти його в автономному режимі, а потім повернути його в Інтернет, коли ми закінчимо обслуговування

Чи є простий спосіб досягти цього? Здавалося б, ми точно не вперше стикаємося з цим питанням.

-Джош


Одним із варіантів було б встановити екземпляр apache чи іншого веб-сервера та встановити на ньому ваш жаль сайт. Потім, коли настане час, зупиніть IIS і запустіть apache і дозвольте йому обробляти всі запити.
фоекс

Як ми зазвичай робимо цю btw, це мати сторінку жалю на пристрої перед сервером, наприклад балансир завантаження.
фоекс

Відповіді:


6

Я б пішов з вашим третім підходом "We're offline" Site in IIS, скажіть, ви його назвали Offline, якщо в ньому немає вказаного заголовка хоста, він буде обслуговувати всі запити, не підхоплені жодним з інших сайтів, які мають відповідне заголовка хоста. Щоб цього не допустити, ви просто зупините всі інші сайти.

Припустимо, у вас встановлено IIS Scripting, відкрийте підвищений PowerShell:

import-module webadministration

тепер ви можете зупинити всі сайти, крім офлайн:

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

коли резервне копіювання SQL-сервера, запустіть їх знову:

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

Якщо у вас також є FTP-сайти, команди покажуть помилку, оскільки ви не можете передати FTP-сайт на командлет Stop-WebSite, але він все ще працює на всіх веб-сайтах.

Якщо у вас є сайти, які зазвичай не працюють, їх потрібно виключити у другій команді, наприклад:

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

Якщо у вас немає встановлених командлетів PowerShell для IIS, ви можете використовувати appcmd.exe, щоб зробити те саме, я не використовував це в роки.


2

Всі наші сайти налаштовані в IIS з єдиним IP-адресою.

1) візьміть старий робочий стіл, запустіть живий дистрибутив Linux, надайте йому той же ip, що і вікно IIS, не підключайте його до мережі

2) запустіть nginx на прямому вікні Linux і зробіть сторінку простою так, як вам подобається, протестуйте її за допомогою офлайн-перемикача / концентратора, підключеного до ур-ноутбука

3) від'єднайте кабель Ethernet від IIS box і підключіть його до прямої коробки Linux.

4) очистити кеш-пам'ять mac addr при перемиканні (або потужності рулону). Ваш веб-сайт простою опублікований.


0

Встановіть Apache і створіть віртуальний хост, як описано нижче path\to\apache\conf\extra\httpd-vhosts.conf:

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

    # Other directives here
</VirtualHost>

Потім у корені документа, зазначеному у вищенаведеному налаштуванні, створіть файл index.html з повідомленням офлайн.

Наступний крок дуже важливий, перед тим як запустити Apache, ви повинні зупинити всі сервіси, які можуть використовувати порт 80. Список більшості з них ви можете знайти за цим посиланням


0

Я знаю, що це старе, але мені довелося це робити на старому вікні Windows 2008 r2. Це відповідь більше для назви питання; Що стосується детальної інформації питання, то це просто один підхід до створення сайту " Ми не в Інтернеті".

Це не покладається ні на що інше, ніж на IIS та статичний HTML. Функціонал "HTTP Redirect" IIS не справляється з тим, що ви хочете, але є інший спосіб їх моделювання. Просто змініть усі "Сторінки помилок" для сайту, щоб вказати на сторінку обслуговування. Так, це працює лише в тому випадку, якщо ви можете використовувати цілий "сайт" в IIS.

У моєму випадку на сайті є один файл "default.htm" у кореневій папці (наприклад, c: \ InetPub \ wwwroot). Отже всі "Сторінки помилок" налаштовані на "Виконати URL-адресу на цьому сайті" та використовувати шлях "/default.htm". Оскільки я використовую абсолютні URL-адреси (тобто починаючи з "/") у файлі, його вміст виконується правильно у веб-переглядачі, незалежно від того, якою буде публічна URL-адреса.

Чистим результатом цієї конфігурації є будь-які / всі запити на сайт, що обслуговують вміст моєї сторінки обслуговування. Не має значення, який запит.

Також майте на увазі, що IIS вплине на цю зміну, створивши файл web.config у кореневій папці. Це те, що воно створило для мене:

 <?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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.