Habilitar la compresión HTTP en IIS y ASP.Net
Ahora que hemos migrado Geeks.ms a un nuevo servidor, que anda un poco más sobradito de CPU, y puesto que lo que generalmente se paga en un hosting dedicado, además del hardware es el ancho de banda, decidí comprimir el tráfico HTTP. Además la velocidad percibida por el usuario suele mejorar al habilitar la compresión. Eso si, nada es gratis en esta vida, a cambio tendrémos un mayor consumo de procesador (en el caso de Geeks.ms debo decir que inapreciable), sobre todo en el lado de servidor. Este mayor consumo se deberá al proceso de compresión y a la incompatibilidad entre la compresión HTTP y el Kernel Caching de IIS. En consecuencia debemos tener estos factores en cuenta antes de habilitar la compresión.
En principio una operación sencilla, que no debería plantear muchos problemas, pero que me costo toda una tarde hacer funcionar.
El problema es que aunque la información existe está muy fragmentada. Además toda esta información está en inglés. Así que aqui va este post para tratar de facilitar la vida a todos los que os enfrenteís a esta cuestión.
1) Activar la compresión Http en IIS: Para ello desde el administrador de IIS, usando el menu contextual Propiedades de la rama Sitios Web (Web Sites, en inglés) accedemos a la pantalla de propiedades del los sitios y vamos a la pestaña Servicio (Service en inglés). Activamos allí la compresión de contenido estático y dinámico. Podemos configurar el directorio en el que se guardará el contenido estático comprimido y el tamaño máximo que tendrá dicho contenido.
2) Añadir la extensión de servicio de compresión: El siguiente paso que hay que dar es posiblemente el menos documentado. Hemos de añadir una nueva Extensión de Servicio Web a nuestro IIS. Esto nada tiene que ver con servicios web. Simplemente se trata de decirle al IIS que queremos usar los servicios de compresión que proporciona la librería gzip.dll. Para ello, desde la rama Extensiones de Servicios Web (Web Service Extensions en inglés) del Administrador de IIs, usaremos el menu contextual Añadir nueva extensión de servicio... (Add new service extension... en inglés) para añadir el nuevo servicio. Basta elegir un nombre (HTTP Compression en la imagen adjunta), introducir la ubicación de la librería gzip.dll y luego marcar el check para que se active la extensión. A pesar de su nombre la librería gzip.dll gestiona la compresión HTTP tanto con GZIP como con DEFLATE.
3) Configurar la metabase para activar la compresión, decir que tipos de páginas queremos comprimir y establecer el nivel de compresión: Parece que el consenso general es que un nivel de compresión 9 es que mejor balance da entre ahorro de tráfico conseguido y consumo de recursos en el servidor. Estas actividades se puede hacer mediante scripting o tocando directamente la metabase de IIS. Puesto que la metabase de IIS es una pieza delicada y que haciendo alguna picia podemos dejar nuestro IIS para el arrastre, yo prefiero la alternativa del scripting frente a la edición directa, además es lo que la documentación de Microsoft recomienda. Los comandos de scripting, que ejecutaremos desde una ventana de comandos donde se encuentre adsutils.vbs, típicamente c:\inetpub\adminscripts, son los siguientes:
Activar la compresión de contenido dinámico:
cscript adsutil.vbs set w3svc/filters/compression/parameters/HcDoDynamicCompression true
Activar la compresión de contenido estático:
cscript adsutil.vbs set w3svc/filters/compression/parameters/HcDoStaticCompression true
Establecer el nivel de compresión:
cscript adsutil.vbs SET W3Svc/Filters/Compression/GZIP/HcDynamicCompressionLevel "9"
cscript adsutil.vbs SET W3Svc/Filters/Compression/DEFLATE/HcDynamicCompressionLevel "9"
Configurar las extensiones de contenido estático a comprimir tanto para GZIP como para DEFLATE:
cscript adsutil.vbs SET W3SVC/Filters/Compression/Deflate/HcFileExtensions "htm html css txt js"
cscript adsutil.vbs SET W3SVC/Filters/Compression/gzip/HcFileExtensions "htm html css txt js"
Configurar las extensiones de contenido dinámico a comprimir tanto para GZIP como para DEFLATE:
cscript adsutil.vbs SET W3SVC/Filters/Compression/Deflate/HcScriptFileExtensions "asp dll aspx ashx"
cscript adsutil.vbs SET W3SVC/Filters/Compression/gzip/HcScriptFileExtensions "asp dll aspx ashx"
4) Comprobar que la compressión HTTP está funcionado: para ello podeís usar la página www.pipeboost.com (podéis ver el ejemplo de Geeks.ms) que tiene un comprobador online o Fiddler, que nos permite ver si estamos recibiendo el contenido comprimido, observando las cabeceras. Podeís ver una imagen de Fiddler abajo.

Decir que la portada de Geeks.ms pasa de 113226 bytes 14830 bytes, un 13% del tamaño sin comprimir.
El archivo adjunto a este artículo contiene un .bat con los comandos necesarios para habilitar la compresión.
Más información en inglés:
IIS Compression in IIS6.0 - Scott Forsyth's WebLog
Using HTTP Compression (IIS 6.0)