Временно перенаправить * все * запросы 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>

Это не сработало. Мы запускаем 64-разрядную версию .NET 4.0 в IIS, но «на всякий случай» я поместил одно и то же в глобальные файлы web.config 32-разрядной и 2.0-версии, и все еще без изменений.

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

Еще одно предложение, которое я видел, - это «специальный» файл app_offline.htm , но мы возвращаемся к той же самой проблеме: для развертывания этого файла в корне приложения всех наших приложений потребовалось больше времени, чем для его обслуживания.

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

Все наши сайты настроены в IIS с одним IP. Это работает для нас даже без SNA, потому что все наши приложения имеют один SSL-сертификат (это UCC). Одна вещь, которая пришла мне в голову, состояла в том, что, возможно, я мог бы настроить сайт в IIS, который соответствовал бы всему трафику с IP-адресом, который мы используем, и не указывал значение заголовка узла. Была надежда на то, что я смогу придать ему более высокий «приоритет» и что он при запуске будет сопоставлять весь трафик с этим IP, прежде чем любой из других сайтов сможет его найти. Я мог бы настроить этот сайт так, чтобы он обслуживал одну и ту же страницу для всех запросов, независимо от URL запроса.

Запустите этот сайт, когда проходите техническое обслуживание, и остановите его, когда закончите.

Но я также не смог заставить это работать, поскольку IIS, кажется, сопоставляет HTTP-запрос с более конкретным сайтом, прежде чем менее конкретным. Таким образом, пропуская значение заголовка узла для этого сайта «сообщите пользователям, что мы не в сети», оно не будет сопоставлено, если в запросе не будет значения заголовка узла, соответствующего другому сайту. Это возвращает нас к той же проблеме, когда приходится вручную переходить к каждому веб-приложению и выполнять действия, чтобы отключить его, а затем снова включить, когда мы закончим техническое обслуживание.

Есть ли простой способ сделать это? Казалось бы, конечно, мы не первые, кто столкнулся с этой проблемой.

-Josh

мистифицировать
источник
Один из вариантов - установить экземпляр apache или другого веб-сервера и настроить на нем свой извиняющийся сайт. Затем, когда придет время, остановите IIS и запустите apache, и он обработает все запросы.
Феб
Обычно мы делаем это, кстати, так, чтобы на устройстве перед сервером находилась страница с сожалением, например, балансировщик нагрузки.
Феб

Ответы:

6

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

Предполагая, что у вас установлен IIS Scripting, откройте PowerShell с повышенными правами:

import-module webadministration

Теперь вы можете остановить все сайты, кроме Offline:

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) взять старый рабочий стол, запустить live linux distro, дать ему тот же ip, что и в окне IIS, не подключать его к сети

2) запустите nginx на live linux box и создайте страницу простоя как вам нравится, протестируйте ее с помощью автономного коммутатора / концентратора, подключенного к вашему ноутбуку

3) отключите сетевой кабель IIS box и подключите его к live linux box.

4) очистить кэш macr addr на коммутаторе (или выключить питание). Ваш сайт простоя теперь жив.

nandoP
источник
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 с автономным сообщением.

Следующий шаг очень важен, вы должны остановить все службы, которые могут использовать порт 80, прежде чем запускать Apache. Вы можете найти список большинства из них по этой ссылке

SaidbakR
источник
0

Я знаю, что это старый, но я просто должен был сделать это на старой коробке Windows 2008 r2. Это ответ больше для названия вопроса; Что касается деталей вопроса, то это просто один из подходов к созданию « Мы в автономном режиме в IIS».

Это не зависит ни от чего, кроме IIS и статического HTML. Функциональность IIS «HTTP Redirect» не обрабатывает то, что вы хотите, но есть другой способ имитировать это. Просто измените все «Страницы ошибок», чтобы сайт указывал на страницу обслуживания. Да, это работает, только если вы можете использовать весь «сайт» в 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>
управляющий фермой
источник