Arquitectura de IIS 7
Hoy revisaremos la arquitectura de IIS 7 y sus diferencias con la versión anterior de IIS. Si no lo han hecho aún, les recomiendo echarle un ojo al post anterior sobre la arquitectura de IIS 6.
La base en la distribución de componentes en IIS 7 se mantiene en comparación con la de IIS 6. Los componentes de IIS están divididos en dos grandes grupos: un grupo de componentes que se encuentra en el modo Kernel y un grupo de componentes que están incorporados en procesos de modo usuario.
Como es de esperar, algunos cambios importantes han tenido lugar tal como se muestra a continuación (No te desesperéis, acá te explicaré el por qué de estos cambios y cómo llegamos a la versión final de la arquitectura implementada en IIS 7.X, la cual se mantiene para IIS 8.X.):
Figura 1. Cambios en el diagrama de arquitectura de IIS 7 |
Componentes en modo Kernel
La distribución de componentes en modo Kernel muestra ahora dos componentes adicionales, SSL y Windows Authentication. La razón de esto es la de disminuir el impacto en performance por la gran cantidad de context switches entre HTTP.sys y lsass.exe durante la ejecución de tareas de decodificación y autenticación windows. El resultado es que ahora HTTP.sys realiza decodificación SSL y que el Windows Authentication puede manejarse a través del cache de HTTP.sys.
Aparte de lo mencionado anteriormente, no mucho ha cambiado a nivel de HTTP.sys. Otro par de características que podemos mencionar son la inclusión de contadores de desempeño (performance counters) propios de HTTP.sys, así como integración con el comando NetSh.
Componentes en modo Usuario
Lo primero que se debe mencionar a nivel de componentes en modo usuario es el hecho de que FTP Service y NNTP Service ya no están alojados en el proceso inetinfo.exe. FTP Service vive ahora en el proceso llamado svchost.exe y NNTP Service ya no es soportado en IIS 7.X/8.X.
El componente Application Host Helper Service (AppHostSvc) se encarga de realizar tareas de respaldo de la configuración de IIS presente en el archivo ApplicationHost.config.
El componente W3ADM fue reemplazado por Windows Process Activation Service (WAS). Este nuevo servicio es el responsable de iniciar y manejar los worker process así como de reciclarlos de forma reactiva. Adicionalmente, a través de WAS es posible trabajar con peticiones utilizando protocolos distintos a HTTP, entonces, a pesar que IIS cumple con el rol de servidor web, WAS nos permite no estar atados al protocolo HTTP.
inetinfo.exe continúa existiendo, más que todo para soportar compatibilidad con aplicaciones legacy. En lugar de la metabase, ahora existe un emulador de la metabase que se parece y se comunica tal como la hacía la metabase original, sólo que en su lugar lo que hace es traducir información para el nuevo modelo de configuración de IIS presente en el archivo ApplicationHost.config.
lsass.exe aún es utilizado para decodificación SSL y Windows Authentication, con el agregado de que una parte importante de su implementación reside en HTTP.sys como mencionamos previamente.
Del lado de los worker process, ahora vemos que tenemos los managed modules y native modules. Los managed modules son componentes .NET que pueden acoplarse al modo integrado de pipeline. No sudéis que más adelante hablaremos de los pipelines. ;-)
Los native modules son componentes desarrollados en C++ y que pueden acoplarse a los worker process. De hecho, esta es la forma como se han desarrollado los componentes nativos desde IIS 6 hasta IIS 8, a través de las native APIs. Esto facilita también todo lo relacionado con soporte de aplicaciones legacy.
Según la nueva distribución de componentes en la arquitectura, la versión final implementada desde IIS 7 es como se muestra a continuación:
Figura 2. Diagrama de arquitectura de IIS 7 |
Nota: los nuevos servicios AppHostSvc, FTP Service y WAS son alojados por svchost.exe, por distintas instancias de svchost.exe.
Flujo de trabajo e interacción entre componentes
Cuando se inicia un servidor que corre IIS, el servicio WAS lee la información del archivo de configuración ApplicationHost.config y crea el setup para HTTP.sys de manera similar como sucedía con WWW Service al iniciar la tabla de enrutamiento.
Al igual como sucede en IIS 6, HTTP.sys valida la petición que recibe:
- Si la petición es inválida: se envía el error HTTP correspondiente al cliente.
- Si la petición es válida, HTTP.sys verifica la posibilidad de dar respuesta a la petición desde su cache.
- Si la respuesta existe en el cache, HTTP.sys la envía inmediatamente
- De lo contrario, HTTP.sys coloca la petición en la cola de peticiones específica para el application pool correspondiente según la tabla de enrutamiento.
Seguidamente HTTP.sys pregunta si existe un worker process que pueda procesar la petición:
- Si existe uno o más worker process ejecutándose y escuchando la cola de peticiones, el worker process toma la petición directamente de la cola, la procesa y posteriormente envía la respuesta a HTTP.sys y al cliente.
- De no ser así, HTTP.sys le notifica a WWW Service que se necesita un worker process. A su vez, WWW Service le pide a WAS que inicie y configure un worker process basado en la información alojada en el archivo ApplicationHost.config.
Nota: En el caso de IIS 7.5+, existe un módulo adicional que nos ayuda a mejorar el nivel de respuesta de nuestros sitios web cargando las aplicaciones web antes de que la primera petición llegue al servidor. El módulo fue llamado Application Initialization y el mismo forma parte de una instalación en forma de extensión de IIS 7.5 (la cual debe ser descargada posterior a la instalación de IIS), aunque ya en IIS 8 forma parte de las opciones de instalación propias del producto incorporadas en el sistema operativo.
Todo esto está muy bien, pero cómo se ve esto en la práctica?
Pues para verlo, se puede ejecutar la herramienta de consola tasklist utilizando el parámetro svc para que nos muestre las distintas instancias de procesos y los procesos que alojan:
Figura 3. Ejecución de comando tasklist |
Esto es todo por hoy, espero les sea útil la información. Hasta la próxima. :-)
Referencias
Introduction to IIS 7 Architecture
https://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture
Application Initialization Module for IIS 7.5
https://www.iis.net/downloads/microsoft/application-initialization
IIS 8.0 Application Initialization
https://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization