Quería comentarles acerca de la técnica de compresión HTTP. Para los no entendidos el http es el protocolo que usan los navegadores y los servidores web para conversar entre ellos. A través de éste protocolo el servidor envía las páginas webs, imágenes, archivos, etc, que le solicita el cliente, tal y como están almacenados en el servidor.
No hay problema con las imágenes pues normalmente están en formato comprimido como jpf o gif, sin considerar el cuidado que debe tener el diseñador para usar imágenes de poco peso. Sin embargo gran parte de la información que se envía son los documentos html que al fin y al cabo son texto, sin contar documentos u otros archivos sin comprimir. Si dicha información estuviera comprimida la velocidad de descarga de las páginas sería mucho mayor, sobre toda en aquellas donde se muestra mucho contenido html como en formularios o tablas. Aquí es donde entra la técnica de HTTP Comprimido, el servidor envía toda la información al cliente comprimida y el cliente la descomprime, por supuesto ésta forma de trabajo debe ser soportado por servidor y cliente, en éste último caso es donde hasta hace un par de años habían muchos problemas porque los navegadores no lo soportaban adecuadamente o decían que lo soportaban cuando en realidad no lo hacía, pero en la actualidad la gente dispone de navegadores con todo el soporte adecuado y ya no es una excusa para no usarlo.
La compresión se da del servidor al cliente, no del cliente al servidor. El cliente al momento de enviar una peticion envia en su cabecera la línea:
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 ésta forma es el del popular Slashdot (www.slashdot.org), es uno de los motivos por los que es tan rápido.
Con HTTP Comprimido ganamos lo siguiente:
1. La páginas 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 organización lo cual resulta en un ahorro de dinero considerable si el mayor tráfico proviene de sus servidores web.
3. Los servidores entregan más rápido la información y por lo tanto se liberan más rápido 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 mínima, en realidad mayor es la carga al conectarse a paginas cifradas (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 páginas estáticas:
navegador <---> [ servidor web (apache) ]
Para el caso de páginas dinámicas:
navegador <---> [ servidor web (apache) <---> cgi o modulo (php por ejemplo) ]
En ambos casos podemos activar la compresión a nivel del servidor web, esto tiene la ventaja de que incluso páginas estáticas sean comprimidas al momento del envío.
En el caso de páginas dinámicas podemos dejar la tarea de compresión al cgi o módulo del servidor web. En este caso uso el ejemplo del modulo de PHP. El PHP se encargar del trabajo de compresión y generación de las cabeceras respectivas a nivel del HTTP.
Para activar la compresión en el Apache tenemos 2 situaciones distintas según si es Apache 1.3 o el Apache 2.
Para el primer caso solo indicaré que debemos activar el modulo mod_gzip, fijarse si está 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 está 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 éstas líneas al final pues el mod_deflate debe ser el último módulo en ser cargado. Reiniciar el Apache y listo.
Como indique también existe la opción de activar la compresión 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 páginas estáticas. Pueden buscar en Internet diversas formas de implementar la compresion a nivel de programación php, sin embargo la mayoría tiene aplicaciones funcionando en las cuales iniciar un proceso de modificacion de los scripts puede ser desalentador, felizmente se tiene la opción de activarlo a nivel general desde el archivo de configuracion del php, es decir, el /etc/php.ini. Lo más aconsejable es sólo modificar la siguiente línea:
zlib.output_compression = On
Reiniciamos el Apache y listo. Lo malo de este solución es que se aplica la compresión de forma global, pero podemos indicar en el httpd.conf la desactivación de la compresión en un archivo en particular, sólo añadir las siguiente líneas:
php_flag zlib.output_compression Off
y reiniciar el Apache.
He realizado pruebas de performance y el método de compresión me resulta mucho más rápido si lo ejecuto desde el php mismo. Tal vez sea porque el modulo mod_deflate viene por defecto para trabajar con un nivel de compresión rápido, 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 opción de desactivar la compresión http en el script que lo requiera, esto se hace con una entrada en el httpd.conf del tipo:
“<"FilesMatch mi_script.php">“
php_flag zlib.output_compression Off
“<"/FilesMatch">“
Bueno, espero les sirva el tip, y que muchos se animen a activar las compresión http en sus sites, sería bueno que compartan sus experiencias, sólo deben tener en cuenta que a nivel de LAN tal vez no noten el cambio pues el medio es muy rápido para transmitir la información, el cambio se percibe mas con un modem o desde otra red remota. En mi caso la velocidad mejoro un 50% !, fue espectacular !
Genial articulo es el 2do en google :p
Gracias!!!
Excelente Articulo