У нас є сервер 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-запиту більш конкретному сайту перед менш конкретним. Отже, опустивши значення хост-заголовка для цього сайту "скажи користувачам, що ми в офлайні", він не збігався, якщо запит не мав значення заголовка хоста, що відповідало іншому сайту. Що ставить нас назад перед тією самою проблемою, що нам потрібно вручну перейти до кожного веб-додатка та виконати дію, щоб зняти його в автономному режимі, а потім повернути його в Інтернет, коли ми закінчимо обслуговування
Чи є простий спосіб досягти цього? Здавалося б, ми точно не вперше стикаємося з цим питанням.
-Джош