MOD_CACHE es un módulo del servidor web Apache que como casi todos los módulos existentes en este servidor web, existe para cubrir las funcionalidades definidas en los estándares en las múltiples RFC existentes, en este caso concreto MOD_CACHE intenta cubrir las especificaciones técnicas que se describen en la RFC 2616, la cual describe un amplio conjunto de funcionalidades para el protocolo HTTP 1.1, entre las que se incluyen, el uso de las caches y los mecanismos de control, definiendo que tipos de contenidos pueden ser “cacheables” y que tipo de elementos pueden almacenarse en dicha cache.

En primer lugar, es importante resaltar que el concepto de “cache” adquiere sentido en aquellas situaciones en las que un servidor web debe tener unos buenos niveles de fiabilidad y escalabilidad, una “cache” es simplemente un sistema que se encarga de almacenar de forma temporal, las peticiones que son realizadas por los clientes en un espacio de almacenamiento reservado que es controlado y administrado por dicho sistema. La finalidad de cualquier sistema de caches, es simplemente proveer un rápido acceso a los contenidos cacheados, donde cada contenido cacheado corresponde a una petición que ha realizado alguno de los clientes con anterioridad.

Actualmente existen bastantes sistemas de almacenamiento que se encargan de mantener la consistencia de las caches y de que su funcionamiento sea el adecuado, en este sentido, el módulo MOD_CACHE requiere los servicios de uno o varios de esos sistemas de cacheo, en esta publicación intentaré explicar los dos módulos de almacenamiento principales que vienen incluidos en prácticamente cualquier distribución moderna de Apache: mod_mem_cache y mod_mem_disk

Tal como su nombre lo indica, cada uno de estos módulos base, implementan sistemas de administración de almacenamiento basado en disco y basado en memoria, en el primero de los casos (basado en disco) todos los contenidos cacheados son almacenados directamente en un espacio reservado en disco duro, mientras que en el segundo caso (basado en memoria) todos los contenidos son almacenados en memoria, sin embargo cuando se trata de almacenamiento basado en memoria, se cuenta con unas cuantas opciones de configuración adicionales, ya que el cacheo basado en memoria en Apache, puede ser ejecutado en uno de dos posibles modos, cacheo de descriptores de ficheros abiertos o directamente el cacheo de objetos, siendo el segundo modo, el mas exigente en términos de uso de memoria.

Estos dos módulos incluidos en Apache, tienen sus propias directivas de configuración (que se verán en la próxima publicación) que permiten controlar el sistema de cacheo, sin embargo en MOD_CACHE existen algunas directivas que permiten especificar de forma muy “fina” la forma en la que se van a cachear las peticiones de los usuarios, así como también que elementos del servidor son susceptibles de ser cacheados y cuales no deben ser cacheados de ningún modo. Como es acostumbrado en esta serie de artículos, antes de explicar el funcionamiento de estas directivas, explicaré el proceso de instalación de Mod_Cache en un servidor web Apache 2.2.x (el procedimiento es el mismo para versiones 2.4.x)

INSTALACIÓN DE MOD_CACHE

Con el uso de la utilidad APXS, es posible instalar este módulo directamente en el servidor web tal y como se ha visto anteriormente con otros módulos de Apache, la utilidad APXS se encuentra ubicada en el directorio bin y los módulos se encuentran ubicados en el directorio modules. En este caso, el módulo de mod_cache se encuentra en el directorio modules/cache. Desde dicho directorio, solamente es necesario ejecutar los siguientes comandos:

#../../bin/apxs -i -c -Wl,lz mod_cache.c cache_storage.c cache_util.c

#../../bin/apxs -c -i mod_mem_cache.c cache_cache.c cache_pqueue.c cache_hash.c

El resultado de la ejecución del comando anterior, es la generación del modulo DSO en el directorio modules el cual contiene todo lo necesario para incluir las directivas de mod_cache en el fichero de configuración global de Apache. Para comprobar que el módulo se ha compilado correctamente y que Apache puede utilizarlo, se carga en el fichero de configuración de la siguiente forma.

LoadModule cache_module modules/mod_cache.so

<IfModule mod_cache.c>

<IfModule mod_disk_cache.c>

CacheRoot /opt/cacheroot

CacheEnable disk /

CacheDirLevels 5

CacheDirLength 3

</IfModule>

LoadModule mem_cache_module modules/mod_mem_cache.so

<IfModule mod_mem_cache.c>

CacheEnable mem /

MCacheSize 4096

MCacheMaxObjectCount 100

MCacheMinObjectSize 1

MCacheMaxObjectSize 2048

</IfModule>

# When acting as a proxy, don’t cache the list of security updates

CacheDisable http://security.update.server/update-list/

</IfModule>

Si el servidor web arranca correctamente, indica que el módulo se ha compilado correctamente y ahora esta instalado en la instancia del servidor web. En esta configuración ya se han indicado algunas directivas básicas que son importantes en mod_cache, sin embargo no son las únicas, a continuación se explica el funcionamiento de las principales directivas contenidas en mod_cache.

DIRECTIVAS EN MOD_CACHE

CacheDisable: Se trata de una directiva que permite establecer cuales contenidos no deberían ser cacheados por mod_cache.

CacheDisable /ficherosSinCache

De esta forma, los contenidos que se encuentran en dicho directorio en el servidor web, no serán cacheados por este módulo.

CacheEnable: Es una directiva similar a la directiva CacheDisable en el sentido que permite establecer de forma bastante granular, que contenidos se deben cachear y bajo que tipo de cache. Esta directiva recibe como parámetros dos argumentos, el primero de ellos es el tipo de cacheo que se va a utilizar, donde los posibles valores aceptados son, mem para especificar una cache basada en memoria, disk para especificar una cache basada en disco por medio del uso del módulo mod_disk_cache y fd indica a mod_cache que use una cache basada en file descriptors.

CacheEnable mem /contenidosMemoria

CacheEnable disk /contenidosDisco

CacheEnable fd /contenidosFileDescriptors

En el caso de que exista un solapamiento, el orden de aparición de las directivas CacheEnable será el que determina cual será el gestor de almacenamiento utilizado, por ejemplo

CacheEnable disk /contenidosDisco

CacheEnable mem /contenidosDisco/contenidosMemoria

En este caso, el gestor de almacenamiento a utilizar será mem.

CacheDefaultExpire: Esta directiva permite especificar el tiempo por defecto que los recursos permanecerán cacheados en el servidor web, este valor se especifica en segundos

CacheDefaultExpire 86400 #24 horas.

CacheMaxExpire: Esta directiva es similar a la directiva CacheDefaultExpire, con la diferencia que este es el valor máximo que cualquier contenido puede estar cacheado sin realizar su correspondiente sincronización con el servidor web, esto quiere decir, que cuando se cumpla este limite de tiempo, los recursos cacheados serán chequeados con los recursos originales almacenados en el servidor, con la finalidad de buscar cambios y reflejarlos en la cache.

CacheMaxExpire 23200 #12 horas.

Directivas de control de headers y peticiones

Mod_Cache incluye un conjunto de directivas que permiten controlar como tratar determinadas peticiones de los clientes que incluyen headers relacionados con contenidos cacheables, como por ejemplo PRAGMA, LAST-MODIFIED o CACHE-CONTROL, algunas de estas directivas son:

CacheIgnoreCacheControl: Cuando una petición HTTP contiene el header Cache-Control con el valor “no-cache” indica que el contenido que debe proveer el servidor no debe ser contenido cacheado, sin embargo esta directiva permite modificar el comportamiento del servidor cuando una petición tiene este header, de esta forma, es posible ignorar dicho header de la petición y servir contenidos que se encuentran almacenados en la cache. Los posibles valores de esta directiva son On y Off, en el caso de establecer el valor “On”, indica que el servidor web debe ignorar este header y tratar de consultar la cache del servidor.

Cuando una petición HTTP contiene el header Pragma con el valor “no-cache”, sucede lo mismo que con el uso del header Cache-Control.

CacheIgnoreCacheControl On

Con este valor, la respuesta a las peticiones realizadas por el cliente, siempre se intentarán realizar por medio de la cache del servidor.

CacheStorePrivate: Del mismo modo que ocurre con la directiva CacheIgnoreCacheControl con esta directiva se puede sobre-escribir el comportamiento de las peticiones que contengan el header Cache-Control con el valor “private”. Cuando este valor se especifica en dicho header, se le indica al servidor web que los valores de la respuesta no se deben cachear, sin embargo con esta directiva, se omite dicho comportamiento y se intenta cachear el contenido. También es importante anotar que la información que debe ser protegida, como por ejemplo aquellos contenidos que requieren autorización no son cacheados bajo ningún concepto. Los posibles valores de esta directiva son “On” y “Off”.

CacheStorePrivate On

CacheIgnoreHeaders: Se trata de una directiva interesante, que permite especificar las respuestas que no deberían cachearse cuando sus correspondientes peticiones contengan alguno de los headers de la lista que se indica como argumento en esta directiva. Sin embargo, es importante anotar, que existen algunos headers que por convención no se cachean, dichos headers son:

  • Keep-Alive
  • Upgrade
  • Proxy-Authenticate
  • Proxy-Authentication
  • Transfer-Encoding
  • Connection
  • Trailers

Lo que hace esta directiva es, sumar a la lista anterior, los headers que no se deben van a cachear, por ejemplo:

CacheIgnoreHeaders Location Set-Cookie

Estas son solo algunas de las directivas que se pueden utilizar en Mod_Cache, en la próxima publicación, se explicarán algunas otras directivas y modos de configuración que pueden implementarse sobre mod_cache.