App Service Problemas comunes

Solucionar problemas con Application Initialization en Azure App Services.

¿Qué es Application Initialization en IIS?

Es un módulo muy útil que nos ofrece IIS el cual nos permite calentar la aplicación antes de que esta reciba solicitudes.

De esta manera nos ayuda a evitar que nuestra aplicación reciba
solicitudes antes de estar lista para procesarlos y problemas relacionados con
el tiempo que toma en cargar nuestra aplicación después de un reinicio.

Application Initialization module

¿Qué debemos preguntarnos antes de considerar la implementación de este módulo?

  • Si su página de inicio realiza algún tipo de redireccionamiento.
  • Si su aplicación requiere HTTPS.

Ya que estos son los
problemas más frecuentes con los que nos podemos enfrentar a la hora de
utilizar el modulo de Application Initialization.

Es importante tomar en cuenta que este modulo de IIS esta disponible únicamente para solicitudes de HTTP.

Y es por esto que si su aplicación tiene una regla de redireccionamiento a HTTPS (siguiendo buenas practicas para forzar a los usuarios a realizar las conexiones a su aplicación por medio del protocolo HTTPS), es posible que este módulo no se va a comportar de la manera que lo espera.

¿Como funciona el módulo de Aplication Initialization?

Este módulo
va a enviar una solicitud a una página específica, la cual ya debió ser
configurada en el archivo de configuración de su aplicación el cual es el web.config. 

Cuando se
hace esta solicitud, solo va a esperar una respuesta, la cual puede ser de cualquier
tipo, con esto me refiero a que sin importar el código de respuesta que retorne
esta solicitud, el IIS cree que la aplicación está lista para atender la
solicitud y su inicialización se ha completado, por lo que comenzará a enviar
solicitudes al proceso.

Por lo que,
si su aplicación retorna un 4xx,5xx, 3xx, la misma va a creer que ya esta lista
para procesar las solicitudes. Por ejemplo si tengo una regla de redireccionamiento,
voy a retornar un 302 y el IIS va a considerar que estoy lista para recibir solicitudes
cuando no es el caso.

En escenarios donde se realiza un escalado horizontal de su plan de servicio, estos problemas de solicitudes llegando antes de que el aplicativo esté listo para procesar las solicitudes casi no debería suceder ya que el App Service cuenta con 2 roles distintos el “FrontEnd” y el “Worker” en la infraestructura.

Y los “FrontEnd” no deben enviar solicitudes a los “Workers” hasta que estos estén listos para empezar a procesar las solicitudes.

Verificar que el módulo este funcionando

La única forma
de rastrear si la inicialización se realiza correctamente es habilitando los
logs de solicitudes fallidas.  Esto lo
puedes realizar desde el portal de Azure.

Su aplicación –>App service logs –> Failed Request tracing

Agregue la parte en negrita a su web.config. En la sección <Add Path>, agregue la página de de inicialización configurada para este módulo, ya que esto nos permitirá reducir la cantidad de registros que los FREB crea y capturar cualquier código de estado que devuelva la solicitud.

<?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.web>
        </system.web>
        <system.webServer>
            <applicationInitialization >
                <add initializationPage="/customwarmup.php"/>
            </applicationInitialization>
            <tracing>
                <traceFailedRequests>
                    <clear/>
                    <add path="/customwarmup.php">
                    <traceAreas>
                        <add provider="ASP" verbosity="Verbose" />
                        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
                        <add provider="ISAPI Extension" verbosity="Verbose" />
                        <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,iisnode" verbosity="Verbose" />
                    </traceAreas>
                    <failureDefinitions statusCodes="200-600" />
                </add>
            </traceFailedRequests>
        </tracing>
    </system.webServer>
</configuration>

¿Como obtengo los archivos de logs?

Vaya a Kudu-> D: / home / Logfiles /
W3SVCxxxx

Para ir a Kudu lo puede hacer por medio del portal, en su aplicación diríjase a herramientas avanzadas o accediendo directamente por medio del <nombredesuaplicacion>.scm.azurewebsites.net

Haga clic en el icono de Descarga y ahora
que tenemos los logs lo que debemos hacer es buscar la solicitud que tiene la
ruta de su proceso de inicialización, en nuestro caso seria customwarmup.php.

Si la solitud se realizo por medio del protocolo
de HTTP es muy probable que la respuesta a su solicitud sea un 200. Lo cual nos
indicaría que el modulo de calentamiento funciono de manera correcta.

En caso de que fuerce la solicitud a que
utilice el protocolo de HTTPS la respuesta aquí es un 301 de redireccionamiento,
por lo que la página de inicialización no habría calentado correctamente mi
aplicación.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *