Rediriger temporairement * toutes * les requêtes HTTP / HTTPS dans IIS vers une page de «maintenance du serveur»

10

Nous avons un serveur IIS qui héberge des centaines d'applications Web distinctes, et le serveur de base de données physique qui héberge ces applications va être mis hors ligne pour maintenance pendant une brève période (nous nous attendons à ce qu'il prenne moins de 15 minutes).

Pendant cette période, nous souhaitons rediriger TOUS les trafics qui arrivent, pour n'importe quel site Web, vers une page "nous sommes actuellement en cours de maintenance".

Je me rends compte que je pourrais le faire en accédant à chaque application Web et en configurant une règle de réécriture IIS qui envoie l'utilisateur à une autre page pour toutes les demandes de cette application. Mais cela nous prendrait plus de temps que de faire la maintenance de la base de données!

J'ai essayé trois choses, dont aucune n'a fonctionné:

Règle de réécriture IIS globale

J'ai cherché un moyen simple d'appliquer une règle à tous les sites, d'un seul coup - et ensuite de pouvoir «défaire» cette règle en une étape tout aussi indolore. Jusqu'à présent, aucune de mes tentatives n'a fonctionné. J'ai essayé de mettre cette règle de réécriture dans mon web.config global à 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>

Ça n'a pas marché. Nous exécutons .NET 4.0 64 bits dans IIS, mais "au cas où", je mets la même chose les fichiers Web.config globaux 32 bits et 2.0, et toujours aucun changement.

App_Offline.htm "fichier spécial"

Une autre suggestion que j'ai vue est le fichier "spécial" app_offline.htm , mais nous retrouvons le même problème, car cela prend plus de temps pour déployer ce fichier à la racine de toutes nos applications que pour la maintenance.

Site "Nous sommes hors ligne" dans IIS

Tous nos sites sont configurés dans IIS avec une seule IP. Cela fonctionne pour nous même sans SNA car toutes nos applications partagent un seul certificat SSL (c'est un UCC). Une chose qui m'est venue à l'esprit est que je pourrais peut-être configurer un site dans IIS qui correspond à tout le trafic à l'adresse IP que nous utilisons, et ne spécifie pas de valeur d'en-tête d'hôte. L'espoir était que je pourrais lui donner une "priorité" plus élevée et qu'il, une fois démarré, ferait correspondre tout le trafic à cette adresse IP, avant que les autres sites n'aient une chance de correspondre. Je pouvais configurer ce site pour servir la même page pour toutes les demandes, quelle que soit l'URL de la demande.

Démarrez ce site lors de la maintenance et arrêtez-le lorsque vous avez terminé.

Mais, je n'ai pas pu faire fonctionner cela non plus, car IIS semble faire correspondre une demande HTTP à un site plus spécifique avant moins spécifique. Ainsi, en omettant une valeur d'en-tête d'hôte pour ce site "dites aux utilisateurs que nous sommes hors ligne", elle n'a pas été mise en correspondance à moins que la demande n'ait pas de valeur d'en-tête d'hôte correspondant à un autre site. Ce qui nous remet au même problème de devoir accéder manuellement à chaque application Web et d'effectuer une action pour la mettre hors ligne, puis la remettre en ligne lorsque nous avons terminé la maintenance

Existe-t-il un moyen simple d'accomplir cela? Il semblerait que nous ne sommes certainement pas les premiers à rencontrer ce problème.

-Josh

Josh
la source
Une option serait d'installer une instance d'Apache ou d'un autre serveur Web et d'y installer votre site désolé. Ensuite, le moment venu, arrêtez IIS et démarrez apache et faites-le gérer toutes les demandes.
phoebus
La façon dont nous procédons couramment est d'avoir une page désolée sur un appareil devant le serveur, par exemple un équilibreur de charge.
phoebus

Réponses:

6

J'irais avec votre troisième approche "We're offline" Site in IIS, disons que vous l'avez nommée Offline, si elle n'a pas d'en-tête d'hôte spécifié, elle servira toutes les demandes non récupérées par aucun des autres sites qui ont un en-tête d'hôte correspondant. Pour éviter cela, il vous suffit d'arrêter tous les autres sites.

En supposant que vous avez installé IIS Scripting, ouvrez un PowerShell élevé:

import-module webadministration

vous pouvez maintenant arrêter tous les sites sauf celui hors ligne:

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

lorsque SQL-Server est de retour, redémarrez-les:

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

Si vous avez également des sites FTP, les commandes afficheront une erreur car vous ne pouvez pas diriger un site FTP vers une applet de commande Stop-WebSite, mais cela fonctionne toujours pour tous les sites Web.

Si vous avez des sites qui ne fonctionnent normalement pas, vous devez les exclure dans la deuxième commande, comme:

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

Si vous n'avez pas installé les applets de commande PowerShell pour IIS, vous pouvez utiliser appcmd.exe pour faire de même, je ne l'ai pas utilisé depuis des années.

Peter Hahndorf
la source
2

Tous nos sites sont configurés dans IIS avec une seule IP.

1) prendre un vieux bureau, exécutez distro linux live, lui donner la même adresse IP que la zone IIS, ne pas le connecter au réseau

2) Lancez Nginx sur une boîte Linux en direct et créez la page d'indisponibilité comme vous l'aimez, testez-la en utilisant un commutateur / concentrateur hors ligne connecté à votre ordinateur portable

3) débranchez le câble Ethernet de la boîte IIS et branchez-le dans la boîte Linux sous tension.

4) vider le cache de l'adr mac sur le commutateur (ou rouler l'alimentation). votre site d'indisponibilité est désormais en ligne.

nandoP
la source
0

Installez Apache et créez un hôte virtuel comme suit dans path\to\apache\conf\extra\httpd-vhosts.conf:

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

    # Other directives here
</VirtualHost>

Ensuite, dans la racine du document spécifiée dans le paramètre ci-dessus, créez un fichier index.html avec un message hors ligne.

L'étape suivante est très importante, vous devez arrêter tous les services qui peuvent utiliser le port 80 avant d'exécuter Apache. Vous pouvez trouver une liste de la majorité d'entre eux sur ce lien

SaidbakR
la source
0

Je sais que c'est vieux, mais je devais juste le faire sur une vieille boîte Windows 2008 R2. Ceci est une réponse plus pour le titre de la question; en ce qui concerne le détail de la question, il s'agit alors simplement d'une approche pour la mise en place d'un " site hors connexion dans IIS".

Cela ne repose sur rien de plus que IIS et HTML statique. La fonctionnalité "HTTP Redirect" d'IIS ne gère pas ce que vous voulez, mais il existe un autre moyen de le simuler. Modifiez simplement toutes les "pages d'erreur" du site pour pointer vers la page de maintenance. Oui, cela ne fonctionne que si vous pouvez utiliser un "site" complet dans IIS.

Dans mon cas, le site a un seul fichier "default.htm" dans son dossier racine (par exemple c: \ InetPub \ wwwroot). Ainsi, toutes les "Pages d'erreur" sont configurées pour "Exécuter une URL sur ce site" et utiliser le chemin "/default.htm". Étant donné que j'utilise des URL absolues (c'est-à-dire commençant par "/") dans le fichier, son contenu s'exécute correctement dans le navigateur, quelle que soit l'URL publique.

Le résultat net de cette configuration est que toutes / toutes les demandes adressées au site servent le contenu de ma page de maintenance. Peu importe la demande.

Sachez également que IIS affectera cette modification en générant un fichier web.config dans le dossier racine. Voici ce que cela a créé pour moi:

 <?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
la source