Redirecione temporariamente * todas as solicitações HTTP / HTTPS no IIS para uma página de "manutenção do servidor"

10

Temos um servidor IIS que hospeda centenas de aplicativos Web separados, e o servidor de banco de dados físico que hospeda esses aplicativos ficará offline para manutenção por um breve período (esperamos que demore menos de 15 minutos).

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

Sei que posso fazer isso acessando todos os aplicativos Web e configurando uma regra de reescrita do IIS que envia o usuário para outra página para todas as solicitações desse aplicativo. Mas levaríamos mais tempo para fazer isso do que para fazer a manutenção do banco de dados!

Eu tentei três coisas, nenhuma das quais funcionou:

Regra global de reconfiguração do IIS

Eu tenho procurado uma maneira simples de aplicar uma regra a todos os sites, de uma só vez - e depois poder "desfazer" essa regra em uma etapa igualmente indolor. Até agora, nenhuma das minhas tentativas funcionou. 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 "por precaução", coloquei a mesma coisa nos arquivos web.config globais de 32 bits e 2,0, e ainda assim não há alterações.

App_Offline.htm "arquivo especial"

Outra sugestão que eu vi é o arquivo "especial" app_offline.htm , mas estamos com o mesmo problema: levar mais tempo para implantar esse arquivo na raiz de todos os nossos aplicativos do que realmente faria a manutenção.

Site "Estamos offline" no IIS

Todos os nossos sites são configurados no IIS com um único IP. Isso funciona para nós, mesmo sem o 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 todo o tráfego ao IP que estamos usando e não especificasse um valor de cabeçalho de host. A esperança era que eu desse uma "precedência" mais alta e que, quando iniciada, correspondesse todo o tráfego a esse IP, antes que qualquer um dos outros sites tivesse a chance de corresponder. Eu poderia configurar esse site para exibir a mesma página para todas as solicitações, independentemente do URL da solicitação.

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

Mas também não consegui fazer isso funcionar, pois o IIS parece corresponder uma solicitação HTTP a um site mais específico antes de menos específico. Portanto, ao omitir um valor de cabeçalho de host para este site "informe aos usuários que estamos offline", ele não era correspondido, 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 Web e executar uma ação para colocá-lo offline e colocá-lo novamente online quando concluirmos a manutenção

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

-Josh

Josh
fonte
Uma opção seria instalar uma instância do apache ou outro servidor da web e configurar seu site de desculpas nele. Então, quando chegar a hora, pare o IIS e inicie o apache, para que ele lide com todas as solicitações.
Phoebus
A maneira como costumamos fazer isso é colocar uma página de desculpas em um dispositivo na frente do servidor, por exemplo, um balanceador de carga.
Phoebus

Respostas:

6

Eu usaria sua terceira abordagem "We're offline" Site in IIS, digamos que você o nomeou Offline, se ele não tiver um cabeçalho de host especificado, ele atenderá a todos os pedidos não atendidos por qualquer outro site que tenha um cabeçalho de host correspondente. Para evitar isso, basta parar todos os outros sites.

Supondo que você tenha scripts do IIS instalados, 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-os novamente:

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

Se você também possui sites FTP, 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ê possui sites que normalmente não são executados, é necessário excluí-los no segundo comando, como:

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

Se você não possui os cmdlets do PowerShell para IIS instalados, pode usar o appcmd.exe para fazer o mesmo, mas não utilizo há anos.

Peter Hahndorf
fonte
2

Todos os nossos sites são configurados no IIS com um único IP.

1) pegue uma área de trabalho antiga, execute a distribuição Linux ao vivo, dê o mesmo ip da caixa do IIS, não conecte à rede

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

3) desconecte o cabo Ethernet da caixa IIS e conecte-o à caixa linux ao vivo.

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

nandoP
fonte
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 offline.

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

SaidbakR
fonte
0

Eu sei que isso é antigo, mas eu só precisava fazer isso em uma caixa antiga do Windows 2008 r2. Esta é uma resposta mais para o título da pergunta; no que diz respeito aos detalhes da pergunta, é simplesmente uma abordagem para configurar um " Site offline no IIS".

Isso não depende de nada além de IIS e HTML estático. A funcionalidade "Redirecionamento HTTP" 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 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 possui um único arquivo "default.htm" em sua pasta raiz (por exemplo, c: \ InetPub \ wwwroot). Portanto, todas as "Páginas de erro" estão configuradas para "Executar uma URL neste site" e usam o caminho "/default.htm". Como eu uso URLs absolutas (ou seja, começando com "/") no arquivo, seu conteúdo é executado corretamente no navegador, não importa qual seja a URL pública.

O resultado líquido dessa configuração é que todas / todas as solicitações ao site veiculam o conteúdo da minha página de manutenção. Não importa qual é a solicitação.

Além disso, esteja ciente de que o IIS afetará essa alteração gerando um arquivo web.config na pasta raiz. Isto é o que ele 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>
Granger
fonte