Ene 012014
 
Artículo Apache

El rendimiento de un sitio web puede mejorar significativamente si se implementa un mecanismo de cache de páginas, sobre todo si se trata de un sitio web dinámico, en donde las páginas se generan mediante la ejecución de un script (típicamente escrito en PHP, en Perl o en Java).

Una cache guarda en memoria o en disco el código HTML resultante de la ejecución del script, de modo que cada vez que se recibe una nueva solicitud de la misma página, se entrega al cliente el resultado guardado, sin necesidad de volver a ejecutar el script.

Muchos de los sistemas de gestión de contenido más extendidos, como WordPress o Joomla, se pueden beneficiar de esta funcionalidad.

En este artículo se explica la manera de implementar una cache de páginas en un servidor web Apache, y las consideraciones que hay que tener en cuenta a la hora de hacerlo.

1. Configuración básica de la cache

Para hacer uso de la cache en apache, es necesario habilitar uno de los dos módulos mod_mem_cache o mod_disk_cache. En una instalación típica, estos módulos se habilitan con el comando a2enmod. Por ejemplo, para utilizar mod_disk_cache en una instalación de apache en un sistema linux:

Como vemos, el comando “a2enmod disk_cache” habilita en primer lugar el módulo base mod_cache, y a continuación el módulo solicitado mod_disk_cache.

Para activar el nuevo módulo, es necesario reiniciar el servidor web con el comando “service apache2 restart”, como se indica en la salida del comando. Pero previamente hay que insertar en el fichero de configuración de apache las directrices que activan el uso de la cache:

Como mínimo, hay que incluir la directriz CacheRoot, que indica el directorio en donde se guardarán las páginas preprocesadas.

Por otra parte, la directriz CacheEnable permite especificar la raíz de las URLs de la páginas que queremos guardar en cache. En el ejemplo, “CacheEnable disk /” indica que queremos guardar en cache todas las páginas del sitio.

2. CacheIgnoreHeaders Set-Cookie

El módulo cache guarda, junto con el contenido de la página, los parámetros recibidos en la cabecera http. Pero los servidores web habitualmente controlan las sesiones de usuario utilizando un cookie de sesión, que se envía al cliente mediante el parámetro Set-Cookie en la cabecera. Por esta razón, en casi cualquier caso es conveniente añadir a la configuración de la cache la directriz:

 

3. Estructura de la cache

Para almacenar el contenido de la página, mod_disk_cache calcula un string “hash” a partir de la url que ha sido solicitada. Después, utiliza los primeros caracteres del hash para crear una ruta de varios niveles de subdirectorios debajo del directorio raíz de la cache. Además, como veremos más adelante, también puede guardar distintas versiones de la página según el tipo de navegador del cliente y otra información que puede estar presente en el encabezamiento HTTP de la solicitud.

Por ejemplo, después de habilitar la cache, y navegar por algunas páginas del sitio, podemos comprobar que el directorio cache “/var/cache/apache2” comienza a tener un contenido estructurado en varios niveles de directorios, de la forma:

En el ejemplo, se ha puede ver que hay una estructura de dos niveles de subdirectorios, y el nombre de cada subdirectorio tiene una longitud de dos caracteres.

El número de niveles y la longitud de los nombres de subdirectorio se puede controlar con las directrices CacheDirLevels y CacheDirLength. Por ejemplo:

4. Control de la cache

mod_cache necesita determinar el tiempo de validez de una entrada guardada en la cache. Normalmente, la página generada incluye información al respecto en el encabezado HTTP, en forma de atributos “Cache-Control”, “Expires”, “Vary”, etc. Además, se pueden establecer valores por defecto y valores máximos mediante directrices en el fichero de configuración de apache, como explicamos a continuación.

4.1. Parámetro Expires

En la cabecera HTTP de la respuesta que entrega el servidor cuando se solicita una página puede aparecer un parámetro Expires. Por ejemplo:

Si esta directriz está presente, mod_cache la toma en cuenta para guardar en el directorio cache la copia obtenida, hasta la fecha indicada.

Las solicitudes recibidas para dicha página en fechas anteriores son servidas directamente de la cache.

Cuando llega una solicitud para la misma página en fecha posterior a la indicada en la directriz Expires, mod_cache solicita una al servidor web una copia nueva de la página, y la guarda en cache, con la nueva fecha de límite de validez especificada en el header.

Para páginas que no incluyan en el header HTTP el parámetro Expires, se puede establecer un valor por defecto en el fichero de configuración de apache con la directriz CacheDefaultExpire:

En el ejemplo, se establece la validez de la página en cache en 36000 segundos (diez horas).

Para el contenido dinámico, el parámetro expires puede ser establecido por el script que genera la página.

En el caso de contenido estático (incluyendo imágenes, ficheros js y css, etc…) se puede utilizar el módulo de apache mod_expires para especificar  el tiempo de validez para cada tipo de fichero.

4.2 Parámetro Vary

En la cabecera HTTP de la respuesta a una solicitud también puede aparecer un parámetro “Vary”, que indica al navegador (y al servicio cache) las condiciones en las que se sirven distintas versiones de una misma página. Por ejemplo:

En este ejemplo, el servidor está indicando que:

  • Vary Accept-Encoding – Se servirá una versión distinta de la página (la versión comprimida) para navegadores que admiten compresión gzip
  • Vary User-Agent – Se servirá una versión distinta de la página según que el navegador sea Internet Explorer, Firefox, etc (identificado por el User-Agent que se incluye en la solicitud)
  • Vary Cookie – Se servirá una versión distinta si el navegador envía un cookie (por ejemplo, un cookie de usuario registrado)

En general, es interesante implementar la compresión gzip en nuestro servidor (en apache, utilizando el módulo mod_deflate), y asegurarse de que el header enviado junto con las páginas entregadas incluye el parámetro “Vary Accept-Encoding”. De este modo, el servidor y el servicio de cache siempre enviarán páginas comprimidas si el cliente las acepta, y páginas sin comprimir en caso contrario.

Por el contrario, siempre que sea posible se debe evitar el uso de páginas cuyo código html depende del tipo de navegador, o de un cookie, porque esto obliga al servicio cache a almacenar varias versiones de cada página, y lo hace ineficiente. Si es necesario presentar un contenido distinto para cada uno de estos casos, se puede explorar la posibilidad de implementarlo mediante CSS y javascript.

5. Como refrescar una página en la cache

En ocasiones puede ocurrir que una página ha sido modificada antes del tiempo especificado en el parámetro Expires.

Un navegador puede obtener una copia actualizada de la página directamente del servidor web, y actualizar al mismo tiempo la cache, añadiendo a la cabecera http de la solicitud el parámetro

o bien

Los distintos navegadores tienen teclas de recarga o bien combinaciones de teclas para hacer una solicitud de este tipo. Por ejemplo, en Firefox se puede solicitar la recarga de la página pulsando Control-R.

También las librerías de acceso a internet de los distintos lenguajes de programación suelen incluir métodos para añadir estos parámetros a la cabecera http que se envía al servidor. Por ejemplo, en PHP esto se consigue con una llamada de la forma:

En Java, se puede llamar al método “setUseCaches(false)” de la clase HttpURLConnection .

Pero también podemos configurar el servicio cache para que ignore estos parámetros y continúe entregando la página almacenada en cache. Para ello utilizamos la directriz:

Referencias

 Publicado por en 12:51 pm

 Deja un comentario

(requerido)

(requerido)