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:
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
Pingback: Montar un Servidor Web – nordri's Blog