Optimizando el Rendimiento de Apache con mod_expires y mod_deflate

Llevo unas horas jugando con el plugin PageSpeed de Google que te da una serie de consejos y buenas prácticas a la hora de publicar en Internet. Dos de esos consejos son los de comprimir los archivos que sirves desde el servidor y jugar con la caché del navegador del usuario para que los archivos más estáticos no sean descargados cada vez que entran en el sitio. Veamos como configurar nuestro servidor Apache para mejorar la experiencia de nuestros usuarios.

Lo he probado en Debian tanto Lenny con Apache/2.2.9 como Squezee con Apache/2.2.16.

mod_expires

El módulo viene de serie en ambas instalaciones y para activarlo simplemente hacemos:

# a2enmod expires

Y nos cargará el módulo. Pasamos a configurarlo, tenemos varias opciones que nos lo cuenta la entrada en la documentación de Apache:

Context: server config, virtual host, directory, .htaccess

Lo he probado en server config, virtual host y .htaccess tan sólo cambia donde vamos a escribir las reglas de vida de los tipos de archivo. En server config lo escribiriamos en un archivo:

# vim /etc/apache2/mods-available/expires.conf

y añadiríamos el siguiente contenido:

<IfModule mod_expires.c>
          ExpiresActive on
          ExpiresByType image/jpg "access plus 60 days"
          ExpiresByType image/png "access plus 60 days"
          ExpiresByType image/gif "access plus 60 days"
          ExpiresByType image/jpeg "access plus 60 days"
          ExpiresByType text/css "access plus 1 days"
          ExpiresByType image/x-icon "access plus 1 month"
          ExpiresByType application/pdf "access plus 1 month"
          ExpiresByType audio/x-wav "access plus 1 month"
          ExpiresByType audio/mpeg "access plus 1 month"
          ExpiresByType video/mpeg "access plus 1 month"
          ExpiresByType video/mp4 "access plus 1 month"
          ExpiresByType video/quicktime "access plus 1 month"
          ExpiresByType video/x-ms-wmv "access plus 1 month"
          ExpiresByType application/x-shockwave-flash "access 1 month"
          ExpiresByType text/javascript "access plus 1 week"
          ExpiresByType application/x-javascript "access plus 1 week"
          ExpiresByType application/javascript "access plus 1 week"
</IfModule>

La sintaxis es sencilla, sigue la siguiente regla:

ExpiresByType mime.type "<base> [plus] {<num> <type>}*"

donde

  • base: Puede ser access, now o modification. now es igual a access.
  • La clave plus es opcional. num debe ser un entero y type es uno de los siguiente:
  • years
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds

Así, por ejemplo, le estamos diciendo al navegador del usuario que almacene los archivos de imágenes durante 60 días desde el primer acceso, los archivos multimedia durante un mes y así.

Una vez ajustados estos tiempos conforme a nuestras necesidades hacemos un enlace del archivo de configuración dentro de mods-enabled

# ln -s /etc/apache2/mods-available/expires.conf /etc/apache2/mods-enabled/

y reiniciamos el servidor.

# /etc/init.d/apache2 restart

Un error que me dio en este punto fue que no encontraba el archivo de mime types en la raiz del servidor, por si os encontrais este problema, el archivo está en la documentación de Apache del servidor y lo obtenemos así:

# zcat /usr/share/doc/apache2.2-common/examples/apache2/mime.types.gz > /etc/apache2/mime.types

Si nos decidimos a configurarlo a nivel de Virtual Host tenemos que añadir la configuración dentro de las directiva Directory

Y si preferimos que nuestros propios usuarios del servidor definan la esperanza de vida en sus .htaccess tenemos que permitir el Allow Override a Indexes para que la configuración del servidor pueda ser sobrescrita con las directivas incluidas en este archivo.

mod_deflate

Enviar todo lo que podamos de forma comprimida nos hará ahorrar ancho de banda y nuestro usuarios con conexiones lentas nos lo agradecerán, por eso vamos a habilitar el módulo encargado de hacer esto.

 # a2enmod deflate 

Este módulo ya viene con un fichero de configuración que se enlaza en mods-enabled por lo que sólo tenemos que añadir:

# vim /etc/apache2/mods-available/deflate.conf
  SetOutputFilter DEFLATE
  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

En esta configuración le decimos que comprima todo excepto imágenes, archivos ya comprimidos y pdf’s, podemos hacer que lo comprima todo pero para estos archivos específicos no nos merece la pena y sería un gasto de computación innecesario.

Resultados

Para comprobar los resultado podemos usar el mismo plugin de PageSpeed o instalarnos el plugin para Firefox LiveHeader y ver si nos dice la fecha en la que expira el contenido y si la codificación del contenido es gzip, como podemos ver en la siguiente imagen:

LiveHeaderMark

Live Header

También lo podemos comprobar por línea de comando así:

$ curl -I http://www.muspells.net/images/logo.png
HTTP/1.1 200 OK
Date: Mon, 01 Aug 2011 11:15:39 GMT
Server: Apache
Last-Modified: Wed, 09 Mar 2011 18:36:27 GMT
ETag: "1b1e197-1b3e-49e1101b340c0"
Accept-Ranges: bytes
Content-Length: 6974
Cache-Control: max-age=5184000
Expires: Fri, 30 Sep 2011 11:15:39 GMT
Content-Type: image/png
This entry was posted in Apache and tagged , , , , , . Bookmark the permalink.

One Response to Optimizando el Rendimiento de Apache con mod_expires y mod_deflate

  1. Pingback: Montar un Servidor Web – nordri's Blog

Comments are closed.