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.

Activar Http Compression

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.

Configurar Extension Web

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.

HTTP Compression Header

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)

Published 21/11/2007 18:06 por Rodrigo Corral
Archivado en:
Comparte este post:
http://geeks.ms/blogs/rcorral/archive/2007/11/21/habilitar-la-compresi-243-n-http-en-iis-y-asp-net.aspx

Comentarios

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Muy útil Rodrigo,

Estas cosas siempre están bien tenerlas claras ;-)

Un saludo.

Thursday, November 22, 2007 10:39 AM por Marc Rubiño

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Cuidado entonces con el Internet Explorer Service Pack 1: mas info, www.microsoft.com/.../923762.mspx

Pd. est bug fue incluido en una supuesta mejora para IIS :)

Thursday, November 22, 2007 8:16 PM por Javier Carrillo

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Gracias por el aviso Javier!!!

Thursday, November 22, 2007 9:01 PM por Rodrigo Corral

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Estamos haciendo una aplicacion de escritorio en .NET que funciona con llamadas a servicios web. Se puede utilizar esta compresión sin ningún tipo de actuación sobre la aplicación?

Resumiendo:

Es posible comprimir dataset tipados de un servicio web?

Requiere algún tipo de actuación en el cliente del servicio web?

Gracias

Wednesday, April 9, 2008 12:57 PM por Alejandro

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Alejandro, la verdad es que no lo he probado, pero en teoría creo que es posible.

Si movéis dataset pesados es muy posible que logréis una mejora notable. Creo que vale la pena probarlo.

Digo que en teoria debería funcionar porque IIS marca el contenido como comprimido y las clases clientes de HTTP sobre las que se apoya el proxy de cliente debería entenderlo y ser capaz de descomprimirlo.

Cuentanos los resultados si lo pruebas....

Wednesday, April 9, 2008 1:22 PM por Rodrigo Corral

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Alejandro, parece que hay una forma de hacerlo, pero no utilizando la compresión de IIS:

weblogs.asp.net/.../62475.aspx

Parece ser que la compresión de IIS no funciona porque para comprimir el cliente le debe decir al servidor (mediante una cabecera) que acepta contenido comprimido y los proxies de cliente de .Net no introducen esta cabecera, luego IIS nunca comprimirá el contenido.

Un saludo!

Wednesday, April 9, 2008 1:32 PM por Rodrigo Corral

# re: Habilitar la compresión HTTP en IIS y ASP.Net

En .Net 2.0 hay una propiedad que controla si los proxies de lado cliente añade la cabecera o no: EnableDecompression.

Este post aclara el tema:

blogs.msdn.com/.../4880187.aspx

La conclusión: es posible usar la compresión de IIS con servicios web de Asp.Net... ahora habría que ver cuando mejora el rendimiento, aunque supongo que bastante.

Wednesday, April 9, 2008 1:43 PM por Rodrigo Corral

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Encontré esto que era por lo que no me funcionaba. Decía que no es con espacios que hay que poner enters y tabs.

Warning: The help documents state that you should use a space delimited list for the file extensions, and I have found this to be incorrect. Instead, use new lines and tabs like the following:

<IIsCompressionScheme Location ="/LM/W3SVC/Filters/Compression/gzip"

HcCompressionDll="%windir%\system32\inetsrv\gzip.dll"

HcCreateFlags="1"

HcDoDynamicCompression="TRUE"

HcDoOnDemandCompression="TRUE"

HcDoStaticCompression="TRUE"

HcDynamicCompressionLevel="10"

HcFileExtensions="htm

html

txt"

HcOnDemandCompLevel="10"

HcPriority="1"

HcScriptFileExtensions="asp

dll

exe

aspx">

Wednesday, April 9, 2008 5:50 PM por Alejandro

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Primero y antes de nada gracias por tu ayuda.

Segundo ya fuí capaz de comprimir los datos del IIS

Tercero ya conseguí que los servicios web de la aplicación vayan comprimidos.

Por darte un ejemplo estábamos transfiriendo 2.2 MB de un XML que finalmente quedó en 200kb por lo que la compresión no se nota un poco... se nota mucho.

La diferencia de tiempo ya te puedes imaginar.. . de 5 veces más rápido.

Gracias nuevamente por tu ayuda.

Un saludo, Alejandro.

Wednesday, April 9, 2008 6:39 PM por Alejandro

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Excelente Alejandro, me alegro de que te funcionase.

Wednesday, April 9, 2008 8:53 PM por Rodrigo Corral

# ??Activa ya la compresi??n gzip en tu servidor! | Climens Codelog

PingBack desde  ??Activa ya la compresi??n gzip en tu servidor! | Climens Codelog

# jazlynlafo

scenario volcanic increased new sulfate american efforts beginning

Monday, April 26, 2010 2:24 AM por jazlynlafo

# re: Habilitar la compresión HTTP en IIS y ASP.Net

Hola, tengo un problema relacionado con la compresión HTTP.

Estoy usando IIS 7 y ASP.NET 3.5. El hecho es que tengo una página de petición de disponibilidades aéreas que mueve por lo general más de 1MB de datos (200 recomendaciones de vuelos). Para lograr agilizar la respuesta decidí habilitar la compresión, pero cuando habilito la compresión del contenido DINAMICO (IIS 7)  me genera un comportamiento extraño en el cliente (Solo en IE):

Después de recibir y pintar todo el contenido en el navegador, la barra de estado del IE sigue con la barra de progreso en estado cargando... (Barra en verde), como si aun no se hubiera terminado de cargar la pagina. En realidad si puedo continuar con la operatoria de la pagina pero visualmente es un efecto que puede despistar al cliente.

No me ha quedado de otra que desactivar la compresión dinámica, pero me gustaría poder reactivarla porque mejoraba considerablemente el tiempo de respuesta.

Por favor, si alguien tiene alguna idea al respecto o sabe de algún sitio donde pueda investigar más del tema, se lo agradecería.

Saludos …

Friday, June 25, 2010 10:26 AM por Derbis