Tag Archives: lenny

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

Se Equivocó

Hoy realizaba una nueva instalación de un servidor con una Debian Lenny, instalación desde DVD. Esta máquina hará las veces de Servidor de Directorio para la LAN. Tiene su miga. Partiendo de la base que si un Linux falla, es culpa del administrador (o sea, yo), voy a contar lo que pasó.

En esta instalación el punto más importante estaba en el particionado del disco, el plan era tener la / en raid1 y luego una DAS de 8 Teras en raid5 con LVM2 para /home. Bien, el proceso de instalación avanzó sin problemas hasta la edición del particionado del disco. Físicamente tenemos dos discos sata de 500 GB y el dispositivo /dev/sdc que es la DAS en acceso en bruto, el dispositivo se monta a través de /dev/mapper/datos.

Entonces cuando llegué a este punto de la instalación, el programa me presentó todas estas cosas, tomé sda y creé una partición primaria al final del disco de 490GB, nació sda1, hice lo mismo con sdb, y también nació sdb1, puse los 10GB sobrantes de sda para /boot, ya sda2 y los 10GB de sdb para swap, sdb2. Elegí entonces sda1 y sdb1 y los seleccioné para formar el raid1, nació md0. Posteriormente, le dije que el volumen lógico lo montara en /home. Hasta aquí todo bien.

La instalación prosiguió y al momento de reiniciar e iniciar la nueva instalación… error!! fsck me comenta que la partición /dev/sda2 no tiene una tabla de particiones válida.

CLARO QUE NO es una partición swap, pero es que ahora sda2 no es swap, por alguna razón al reiniciar, el que era /dev/sdc, o sea, el DAS físico había cambiado a /dev/sda! y las líneas en /etc/fstab ya no valían. No todas, al menos. Una vez corregido el inconveniente, reinicié y ya no intentaba checar trozos de disco sin partición.

Aun no entiendo por qué cambió el orden de los dispositivos, cae un mito sobre el poder de Linux, no me esperaba algo de este calibre. Otra cosa que he visto es que también nombra a las particiones en el orden en la que aparecen, no en el orden en el que están físicamente en el disco.

Solucionado el problema, pude irme a casa satisfecho, mañana empezaré la instalación y configuración del nuevo servidor. Pero yo no tuve la culpa!