Tenemos un servidor IIS que aloja cientos de aplicaciones web separadas, y el servidor de la base de datos física que aloja estas aplicaciones se desconectará por mantenimiento durante un breve período (esperamos que tarde menos de 15 minutos).
Durante ese período, queremos redirigir TODO el tráfico que ingresa, para cualquier sitio web, a una página "actualmente estamos en mantenimiento".
Me doy cuenta de que podría hacer esto yendo a todas las aplicaciones web y configurando una regla de reescritura de IIS que envíe al usuario a otra página para todas las solicitudes en esa aplicación. ¡Pero nos llevaría más tiempo hacer eso que hacer el mantenimiento de la base de datos!
He intentado tres cosas, ninguna de las cuales ha funcionado:
Regla global de reescritura de IIS
He estado buscando una manera simple de aplicar una regla a todos los sitios, de una sola vez, y luego poder "deshacer" esa regla en un paso igualmente indoloro. Hasta ahora, ninguno de mis intentos ha funcionado. Intenté poner esta regla de reescritura en mi web.config global en 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>
Esto no funcionó. Estamos ejecutando .NET 4.0 de 64 bits en IIS, pero "por si acaso" puse lo mismo en los archivos web.config globales de 32 bits y 2.0, y aún no hay cambio.
App_Offline.htm "archivo especial"
Otra sugerencia que he visto es el archivo "especial" app_offline.htm , pero volvemos al mismo problema de que lleva más tiempo implementar este archivo en la raíz de la aplicación de todas nuestras aplicaciones de lo que realmente haría el mantenimiento.
Sitio "Estamos fuera de línea" en IIS
Todos nuestros sitios están configurados en IIS con una sola IP. Esto funciona para nosotros incluso sin SNA porque todas nuestras aplicaciones comparten un solo certificado SSL (es un UCC). Una cosa que se me ocurrió fue que tal vez podría configurar un sitio en IIS que coincidiera con todo el tráfico a la IP que estamos usando, y no especificara un valor de encabezado de host. La esperanza era que pudiera darle una "prioridad" más alta y que, cuando comenzara, hiciera coincidir todo el tráfico con esa IP, antes de que cualquiera de los otros sitios tuviera la oportunidad de hacerlo. Podría configurar ese sitio para que sirva la misma página para todas las solicitudes, independientemente de la URL de la solicitud.
Inicie ese sitio cuando esté en mantenimiento y deténgalo cuando haya terminado.
Pero tampoco pude hacer que esto funcionara, ya que IIS parece hacer coincidir una solicitud HTTP con un sitio más específico antes que menos específico. Por lo tanto, al omitir un valor de encabezado de host para este sitio "avisar a los usuarios que estamos fuera de línea", no coincidió a menos que la solicitud no tuviera un valor de encabezado de host que coincidiera con otro sitio. Lo que nos pone de nuevo en el mismo problema de tener que ir manualmente a cada aplicación web y realizar una acción para desconectarla y luego volver a ponerla en línea cuando hayamos terminado con el mantenimiento
¿Hay una manera simple de lograr esto? Parece que seguramente no somos los primeros en encontrarnos con este problema.
-Josh