Enviando webs comprimidas con GZIP ¿a qué esperar?

Autor: Armonth | El lunes 20 de agosto del 2007 @ 20:34.

Una de las formas más radicales de ahorrar ancho de banda en un sitio y acortar los tiempos de carga es comprimir las páginas antes de enviarlas. Vamos a profundizar un poco en el asunto.

Introducción

Para descomprimir páginas web el navegador no necesita ningún "plugin". El navegador, si es capaz, abre de forma transparente la página comprimida y la muestra como si fuera HTML "del de toda la vida".

Tampoco existen incompatibilidades con los distintos navegadores. El navegador decide si puede tratar una página comprimida o no. Si el navegador puede (y hoy en día todos lo hacen) a la hora de enviar la petición para descargar la página lo hace junto a una cabecera Accept-Encoding y es ahí donde el servidor decide cómo enviarla.

¿Y la parte negativa?

Podemos usar varios valores para comprimir, pero toca mencionar la parte negativa de usar compresión: aumenta el consumo de CPU.

La buena noticia es que en general sale a cuenta, aunque sólo sea por quitarte más rápidamente las conexiones abiertas (KeepAlive) que también influyen en el consumo de CPU. En general el aumento de consumo no es acusado y compensa. En algunos casos incluso llega a reducirse.

¿Cómo saber si ya enviamos nuestra web comprimida?

Enviando una petición con Accept-Encoding: gzip, deflate. Para ello hay varias formas e incluso páginas que te lo dicen como GIDZip Test.

Estas herramientas además nos informan del tamaño total y comprimido, por ejemplo (para mi sorpresa) Barrapunto no envía las páginas comprimidas así que vemos que envía 70KB y usando el nivel más bajo de GZIP en lugar de eso sólo enviaría 18KB. Un 75% menos.

La otra manera de comprobarlo es mediante el nunca suficientemente apreciado "wget":

wget -S sigt.net/   
19:57:46 (35.05 KB/s) - `index.html' saved [38603]

wget -S --header="Accept-Encoding: gzip" sigt.net/   
19:57:55 (19.88 KB/s) - `index.html' saved [10447/10447]

En el ejemplo vemos que SigT envía las páginas tanto de forma normal como comprimidas, según la necesidad de cada navegador. A todo lo dicho anteriormente añadir que podemos cambiar Accept-Encoding: gzip por Accept-Encoding: deflate para usar deflate o Accept-Encoding: gzip,deflate para que el servidor pueda elegir entre los dos.

¿Manos a la obra?

Existen muchas maneras de implementar compresión en páginas, la primera pregunta que hay que hacerse es ¿gzip o deflate?. Ambas ofrecen lo mismo pero deflate es más rápido en Apache2.

Vamos a tratar ambas opciones a nivel de módulo para Apache, aunque nada nos impide copiar un HTML estático, comprimirlo con gzip, hacer un script en PHP que haga la negociación de contenidos y encima ahorrarnos la compresión "al vuelo" aunque para sitios grandes puede ser algo complejo de implementar.

mod_gzip

La forma de instalar mod_gzip es simple y en Debian con un apt-get install libapache-mod-gzip ya lo tendremos hecho, sólo faltará buscar en el fichero /etc/apache/httpd.conf la línea:

#LoadModule gzip_module

Y descomentarla (quitarle el #). Luego deberiamos ver algo parecido a:

<ifModule mod_gzip.c>
  Include /etc/apache/mod_gzip.conf
</ifModule>

Que nos esta indicando donde se guarda la configuración de mod_gzip, existen muchos valores y en general los usados por defecto son buenos pero cabe mencionar los siguientes:

mod_gzip_on Yes   
mod_gzip_can_negotiate Yes   
mod_gzip_minimum_file_size 400   
mod_gzip_item_include file .html$   
mod_gzip_item_exclude file .css$

El primer valor es obviamente para activar mod_gzip, el segundo es muy importante ya que se asegura de que se pueda mantener la "negociación" que hemos visto antes (que el navegador pueda recibir el contenido comprimido o no). La tercera línea sirve para que no se comprima nada inferior a 400 bytes dado que no sale a cuenta.

Las dos últimas líneas (que se pueden repetir lo que haga falta) son para incluir o excluir respectivamente los ficheros terminados con esa extensión, por ejemplo no es buena idea comprimir CSS porque aparte de que suele ocupar muy poco, Internet Explorer 6 no lo acepta comprimido.

mod_deflate

Deflate viene a ser en Apache 2.x el sustituto de gzip que ha sido usado intensamente en Apache 1.3.x y en general suele ser más rápido.

Para activar mod_deflate los pasos son prácticamente los mismos, pero en Howto Forge hay un completo manual para implementarlo.

Comentarios