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