En este post trataré sobre una de las posibles formas de comprimir tráfico HTTP servido por Apache. Existe un módulo de extensión de Apache llamado mod_gzip que nos permite hacer esto. Se trata por lo tanto de un módulo no incluido en la distribución pero que si está bajo la licencia de Apache. El tipo de compresión utilizado es gzip.
Pero, ¿por qué comprimir tráfico HTTP?. La respuesta es ahorro de ancho de banda. Esto evidentemente implica que si hay más ancho de banda pues se pueden atender más peticiones.
¿Cómo funciona?. Apache ante una petición realizada por un navegador comprime los datos a enviar “on the fly” y es el cliente (el navegador) el que se encarga de descomprimirlos. Es decir el navegador debe soportar esta descompresión. Más sobre este proceso en esta página
Instalación
La instalación está detallada en esta página
Voy a centrarme en este post en un caso real. Supongamos que queremos cargar el módulo mod_gzip de forma dinámica (lo normal):
1.- Nos bajamos el fuente. Hacer download sobre el fichero tar.gz
2.- Copiamos el fichero en el directorio que queramos, y descomprimimos.
3.- Nos movemos al directorio creado y ejecutamos:
make APXS=path_to_apxs
make install APXS=path_to_apxs
donde path_to_apxs es el camino al fichero apxs, normalmente /usr/sbin/apxs
Al terminar, se habrá copiado el fichero mod_gzip.so en el directorio modules de Apache y se habrá modificado el fichero httpd.conf para cargar el nuevo módulo. Es decir debemos tener en este fichero las siguientes directivas:
LoadModule gzip_module modules/mod_gzip.so
AddModule mod_gzip.c
El módulo debe cargarse el último.
Configuración>
Aquí acompaño un fichero de ejemplo en el que especificamos que queremos comprimir el tráfico HTTP para ficheros html y php. Se puede encontrar una descripción detallada de las directivas en la página
mod_gzip_on Yes
mod_gzip_temp_dir /tmp
mod_gzip_keep_workfiles No
mod_gzip_minimum_file_size 500
mod_gzip_maximum_file_size 500000
mod_gzip_maximum_inmem_size 60000
mod_gzip_dechunk Yes
mod_gzip_command_version ‘/mod_gzip_status’
mod_gzip_handle_methods GET POST
mod_gzip_item_include file .htm$
mod_gzip_item_include file .html$
mod_gzip_item_include file .php.*$
mod_gzip_item_include mime ^text/html$
mod_gzip_item_include mime ^text/plain$
mod_gzip_item_include mime ^application/x-httpd-php
Recomiendo cargar este código en un fichero aparte que podríamos llamar mod_gzip.conf en el directorio conf y lo incluiríamos en el fichero de configuración de apache así (tras la carga de mod_gzip.c):
Include conf/mod_gzip.conf
Puesta en funcionamiento y prueba
Reiniciamos apache. Y ahora qué?. Podemos hacer uso de varias herramientas para testear la compresión. Yo me inclino por ab (apache benchmark) que viene de serie con apache. La sintaxis para probar una página de ejemplo sería:
ab ‘Accept-Encoding:gzip’ http://servidor/pagina.htm
Observamos el tráfico servido y comparamos con el tamaño real del fichero. Es fácil calcular el índice de compresión así, no?
Si nuestro servidor se ve desde Internet podemos probar con la siguiente web
Si tenemos un analizador de estadísticas, que debemos no?, pues se estudian los logs y se sacan conclusiones de la mejora en ancho de banda.
Nota : existen determinados tipos de ficheros, que por sus características, no es de utilidad incluirlos para compresión por este módulo puesto que ya incorporan un elevado nivel de compresión. Es el caso de los formatos de imágenes como jpeg.