Compresión HTTP

Internet
A traves de este protocolo el servidor envia las pagina webs, imagenes, archivos, etc que le solicita el cliente, tal y como estan almacenados en el servidor. No hay problema con las imagenes pues normalmente estan en formato comprimido como jpf o gif, sin considerar el cuidado que debe tener el diseñador para usar imagenes de poco peso. Sin embargo gran parte de la informacion que se envia son los documentos html que al fin y al cabo son texto, sin contar archivos de texto, doc u otros que puedan ser comprimidos. Si dicha informacion estuviera comprimida la velocidad de descarga de las paginas seria mucho mayor, sobre toda en aquellas donde se muestra mucho contenido html como en formularios o tablas. Aqui es donde entra la tecnica de HTTP Comprimido, el servidor envia toda la informacion al cliente comprimida y el cliente la descomprime, por supuesto esta forma de trabajo debe ser soportado por servidor y cliente, en este ultimo caso es donde hasta hace un par de años habian muchos problemas porque los navegadores no lo soportaban adecuadamente o decian que lo soportaban cuando en realidad no lo hacia, pero en la actualidad la gente dispone de navegadores con todo el soporte adecuado y ya no es una excusa para no usarlo. La compresion se da del servidor al cliente, no del cliente al servidor. El cliente al momento de enviar una peticion envia en su cabecera la linea:

Accept-Encoding: gzip, deflate

Esto le permite saber al servidor que el cliente soporta http comprimido, al momento que el servidor entrega los datos añade en la cabecera :

Content-Encoding: gzip

Un ejemplo de un site que trabaja de esta forma es el del popular Slashdot (www.slashdot.org), es uno de los motivos por los que es tan rapido.

Con HTTP Comprimido ganamos lo siguiente:

1. La paginas demoran en descargar en promedio un 50% de tiempo menos, en ocasiones hasta 70% dependiendo de la cantidad de texto.
2. Se optimiza el ancho de banda de la organizacion lo cual resulta en un ahorro de dinero considerable si el mayor trafico proviene de sus servidores web.
3. Los servidores entregan mas rapido la informacion y por lo tanto se liberan mas rapido de las conexiones de los clientes y estan listos para atender a nuevos usuarios.
4. Usuarios contentos :)

Por supuesto implica tener un servidor adecuado pues el CPU tiene ahora la carga de comprimir la data que se envia, del lado del cliente la carga es minima, en realidad mayor es la carga al conectarse a paginas encriptadas (que usan https con ssl o tls).

Ahora nos queda activar la compresion http, pero primero veamos el flujo de informacion entre el cliente y los diversos componente del servidor web

Para el caso de pagina estaticas:

navegador <---> [ servidor web (apache) ]

Para el caso de paginas dinamicas:

navegador <---> [ servidor web (apache) <---> cgi o modulo (php por ejemplo) ]

En ambos casos podemos activar la compresion a nivel del servidor web, esto tiene la ventaja de que incluso paginas estaticas sean comprimidas al momento del envio.

En el caso de paginas dinamicas podemos dejar la tarea de compresion al cgi o modulo del servidor web. En este caso uso el ejemplo del modulo de PHP. El PHP se encargar del trabajo de compresion y generacion de las cabeceras respectivas a nivel del HTTP.

Para activar la compresion en el Apache tenemos 2 situaciones distintas segun si es Apache 1.3 o el Apache 2.

Para el primer caso solo indicare que debemos activar el modulo mod_gzip, fijarse si esta presente en el directorio /etc/httpd/modules (RedHat). Sino esta presente, pues a compilar nuevamente el apache con el parametro respectivo.

En el caso de Apache 2 se usa ahora el modulo mod_deflate, pero no esta configurado en el httpd.conf curiosamente en la mayoria de casos, para ello deben añadir (de preferencia al final) las siguiente lineas:

LoadModule deflate_module modules/mod_deflate.so

# Activamos compresion para contenido texto
AddOutputFilterByType DEFLATE text/html text/plain text/css
SetInputFilter DEFLATE
DeflateFilterNote ratio
# Desactivamos compresion para imagenes, ejecutables y archivos comprimidos
SetEnvIfNoCase Request_URI \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \\.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \\.pdf$ no-gzip dont-vary
# Cabecera necesaria con algunos Proxys
Header append Vary User-Agent env=!dont-vary

De preferencia añadir estas lineas al final pues el mod_deflate debe ser el ultimo modulo en ser cargado. Reiniciar el Apache y listo.

Como indique tambien existe la opcion de activar la compresion desde el PHP, la ventaja es que podemos ser mas selectivos en determinar que scripts deben trabajar de esta forma, la desventaja es que no trabaja obviamente sobre las paginas estaticas. Pueden buscar en Internet diversas formas de implementar la compresion a nivel de programacion php, sin embargo la mayoria tiene aplicaciones funcionando en las cuales iniciar un proceso de modificacion de los scripts puede ser desalentador, felizmente se tiene la opcion de activarlo a nivel general desde el archivo de configuracion del php, es decir, el /etc/php.ini. Lo mas aconsejable es solo modificar la siguiente linea:

zlib.output_compression = On

Reiniciamos el Apache y listo. Lo malo de este solucion es que se aplica la compresion de forma global, pero podemos indicar en el httpd.conf la desactivacion de la compresion en un archivo en particular, solo añadir las siguiente lineas:

php_flag zlib.output_compression Off

y reiniciar el Apache.

He realizado pruebas de performance y el metodo de compresion me resulta mucho más rapido si lo ejecuto desde el php mismo. Tal vez sea porque el modulo mod_deflate viene por defecto para trabajar con un nivel de compresion rapido, lo adecuado seria el nivel normal (o 6). Como comentario adicional tuve problemas con scripts de php que sirven para descargar archivos, los clientes de IE 6.0 sin el service pack 1 no reciben correctamente el nombre del archivo, los que tienen el service pack trabajan sin problemas. De todas maneras se tiene la opcion de desactivar la compresion http en el script que lo requiera.

Bueno, espero les sirva el tip, y que muchos se animen a activar las compresion http en sus sites, seria bueno que compartan sus experiencias, solo deben tener en cuenta que a nivel de LAN tal vez no noten el cambio pues el medio es muy rapido para transmitir la informacion, el cambio se percibe mas con un modem o desde otra red remota. En mi caso la velocidad mejoro un 50% !, fue espectacular !