Temporariamente redirecionar * todos * solicitações HTTP / HTTPS no IIS para uma página de “manutenção do servidor”

9

Temos um servidor IIS que hospeda centenas de aplicativos da web separados, e o servidor de banco de dados físico que hospeda esses aplicativos será colocado off-line para manutenção por um breve período (esperamos que leve menos de 15 minutos) .

Durante esse período, queremos redirecionar TODO o tráfego que chega, para qualquer website, a uma página "estamos passando por manutenção".

Sei que posso fazer isso indo a todos os aplicativos da web e configurando uma regra de reconfiguração do IIS que envie o usuário para outra página para todas as solicitações nesse aplicativo. Mas, levaria mais tempo para fazer isso do que para fazer a manutenção do banco de dados!

Eu tentei três coisas, nenhuma delas funcionou:

Regra de Regravação Global do IIS

Estou procurando uma maneira simples de aplicar uma regra a todos sites, de uma só vez - e, em seguida, ser capaz de "desfazer" essa regra em uma etapa igualmente indolor. Até agora, nenhuma das minhas tentativas funcionou. Eu tentei colocar essa regra de reescrita no meu web.config global em 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>

Isso não funcionou. Estamos executando o .NET 4.0 de 64 bits no IIS, mas "apenas no caso" eu coloquei a mesma coisa nos arquivos web.config globais de 32 e 2.0, e ainda sem alterações.

App_Offline.htm "arquivo especial"

Uma outra sugestão que vi foi o app_offline.htm arquivo "especial" , mas estamos de volta a mesma questão de levar mais tempo para implantar este arquivo para a raiz do aplicativo de todos os nossos aplicativos do que para realmente fazer a manutenção.

"Estamos offline" Site no IIS

Todos os nossos sites são configurados no IIS com um único IP. Isso funciona para nós, mesmo sem SNA, porque todos os nossos aplicativos compartilham um único certificado SSL (é um UCC). Uma coisa que me ocorreu foi que talvez eu pudesse configurar um site no IIS que correspondesse a todo o tráfego para o IP que estamos usando, e não especificou um valor de cabeçalho de host. A esperança era que eu pudesse dar uma "precedência" mais alta e que, quando iniciada, correspondesse a todo o tráfego para aquele IP, antes que qualquer um dos outros sites tivesse uma chance de combinar. Eu poderia configurar esse site para atender a mesma página para todas as solicitações, independentemente do URL de solicitação.

Inicie o site em manutenção e pare quando terminar.

Mas também não consegui fazer isso funcionar, pois o IIS parece corresponder a uma solicitação HTTP para um site mais específico antes de ser menos específico. Assim, ao omitir um valor de cabeçalho de host para esse site "informe aos usuários que estamos off-line", ele não corresponderia a menos que a solicitação não tivesse um valor de cabeçalho de host que correspondesse a outro site. O que nos coloca de volta ao mesmo problema de ter que ir manualmente a cada aplicativo da Web e realizar uma ação para colocá-lo offline e, em seguida, colocá-lo novamente on-line quando terminarmos a manutenção

Existe uma maneira simples de conseguir isso? Parece que certamente não somos os primeiros a encontrar esse problema.

-Josh

    
por Josh 15.11.2013 / 23:48

4 respostas

6

Eu usaria sua terceira abordagem "We're offline" Site in IIS , digamos que você a tenha nomeado Offline , se ela não tiver cabeçalho de host especificado, ela atenderá a todas as solicitações não selecionadas por nenhum outro site que tenha um cabeçalho de host correspondente. Para evitar isso, basta parar todos os outros sites.

Supondo que você tenha o IIS Script instalado, abra um PowerShell elevado:

import-module webadministration

agora você pode parar todos os sites, exceto o offline:

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

quando o SQL-Server estiver em backup, inicie-o novamente:

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

Se você tiver sites FTP também, os comandos mostrarão um erro porque você não pode canalizar um site FTP para um cmdlet Stop-WebSite, mas ele ainda funciona para todos os sites.

Se você tem sites que normalmente não são executados, você deve excluí-los no segundo comando, como:

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

Se você não tiver os cmdlets do PowerShell para o IIS instalados, poderá usar o appcmd.exe para fazer o mesmo, mas não uso isso há anos.

    
por 16.11.2013 / 11:09
2

All our sites are setup in IIS with a single IP.

1) pegue uma área de trabalho antiga, execute live linux distro, dê o mesmo ip da caixa do IIS, faça não conecte-a à rede

2) inicie o nginx no live linux box, e faça a página de downtime como quiser, teste-a usando um switch / hub offline conectado ao seu laptop

3) desconecte o cabo ethernet da caixa IIS e conecte-o na caixa linux ativa.

4) limpar o cache mac addr no switch (ou roll power). seu site de tempo de inatividade agora está ativo.

    
por 16.11.2013 / 02:12
0

Instale o Apache e crie um host virtual como o seguinte em path\to\apache\conf\extra\httpd-vhosts.conf :

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

    # Other directives here
</VirtualHost>

Em seguida, na raiz do documento especificada na configuração acima, crie um arquivo index.html com uma mensagem off-line.

A etapa a seguir é muito importante, você precisa interromper todos os serviços que podem usar a porta 80 antes de executar o Apache. Você pode encontrar uma lista da maioria deles em este link

    
por 28.03.2015 / 01:48
0

Eu sei que isso é antigo, mas eu tive que fazer isso em uma caixa antiga do Windows 2008 r2. Esta é uma resposta mais para o título da pergunta; em relação ao detalhe da questão, é simplesmente uma abordagem para configurar um site " Estamos Offline no IIS".

Isso não depende de nada além do IIS e do HTML estático. A funcionalidade "HTTP Redirect" do IIS não lida com o que você deseja, mas há outra maneira de simulá-lo. Basta alterar todas as "Páginas de erro" para o site para apontar para a página de manutenção. Sim, isso funciona apenas se você puder usar um "site" inteiro no IIS.

No meu caso, o site tem um único arquivo "default.htm" em sua pasta raiz (por exemplo, c: \ InetPub \ wwwroot). Assim, all das "Páginas de erro" são configuradas para "Executar uma URL neste site" e usar o caminho "/default.htm". Como eu uso URLs absolutos (ou seja, começando com "/") no arquivo, seu conteúdo é executado corretamente no navegador, independentemente do URL público.

O resultado líquido dessa configuração é qualquer / todas as solicitações para o site exibir o conteúdo da minha página de manutenção. Não importa qual seja o pedido.

Além disso, esteja ciente de que o IIS afetará essa alteração gerando um arquivo web.config na pasta raiz. Isto é o que criou para mim:

 <?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>
    
por 18.12.2015 / 22:19