Назад | Перейти на главную страницу

Временно перенаправляйте * все * запросы HTTP / HTTPS в IIS на страницу «обслуживания сервера»

У нас есть сервер 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, но «на всякий случай» я поместил то же самое, 32-разрядный и глобальный файлы web.config 2.0, и все равно без изменений.

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

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

Сайт "Мы не в сети" в IIS

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

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

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

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

-Джош

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

Предполагая, что у вас установлен сценарий IIS, откройте 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, чтобы сделать то же самое, хотя я не использовал его много лет.

Все наши сайты настроены в IIS с одним IP.

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

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

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

4) очистите кеш MAC-адресов при переключении (или отключите питание). ваш сайт простоя теперь работает.

Я знаю, что это старый, но мне просто пришлось сделать это на старом компьютере с 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>

Установите 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. Вы можете найти список большинства из них на эта ссылка