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