Almacenamiento en caché · 6 min read · Dec 28, 2025

Almacenamiento en caché con mod_cache de Apache en Debian Lenny

Almacenamiento en caché con mod_cache de Apache en Debian Lenny

Versión 1.0
Autor: Falko Timme
Sígueme en Twitter

Este artículo explica cómo puedes almacenar en caché el contenido de tu sitio web con mod_cache de Apache en Debian Lenny. Si tienes un sitio web dinámico de alto tráfico que genera muchas consultas a la base de datos en cada solicitud, puedes disminuir la carga del servidor drásticamente almacenando en caché tu contenido durante unos minutos o más (eso depende de la frecuencia con la que actualices tu contenido).

¡No emito ninguna garantía de que esto funcione para ti!

1 Nota Preliminar

Asumo que tienes una configuración de Apache2 funcionando (Apache 2.2.x - antes de esa versión, mod_cache se considera experimental) de los repositorios de Debian - la versión de Apache en los repositorios de Debian Lenny es 2.2.9, así que deberías estar listo para comenzar.

Estoy usando la raíz del documento /var/www aquí para mi vhost de prueba - debes ajustar esto si tu raíz del documento es diferente.

2 Habilitando mod_cache

mod_cache tiene dos submódulos que gestionan el almacenamiento en caché, mod_disk_cache (para almacenar contenido en el disco duro) y mod_mem_cache (para almacenar contenido en memoria, que es más rápido que el almacenamiento en caché en disco). Decide cuál quieres usar y continúa con el capítulo 2.1 (mod_disk_cache) o 2.2 (mod_mem_cache).

2.1 mod_disk_cache

La configuración de mod_disk_cache se almacena en /etc/apache2/mods-available/disk_cache.conf, así que editemos ese archivo:

vi /etc/apache2/mods-available/disk_cache.conf

Asegúrate de descomentar la línea CacheEnable disk /, para que la configuración mínima se vea como sigue:

| # la limpieza de caché se realiza mediante htcacheclean, que se puede configurar en # /etc/default/apache2 # # Para más información, consulta los comentarios en ese archivo, # /usr/share/doc/apache2.2-common/README.Debian, y la página del manual htcacheclean(8) #. # Esta ruta debe ser la misma que la de /etc/default/apache2 CacheRoot /var/cache/apache2/mod_disk_cache # Esto también almacenará en caché documentos locales. Generalmente tiene más sentido # poner esto en la configuración de solo un host virtual. CacheEnable disk / CacheDirLevels 5 CacheDirLength 3 |

Puedes encontrar explicaciones para estas opciones de configuración y más opciones de configuración en http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html.

Ahora podemos habilitar mod_cache y mod_disk_cache:

a2enmod cache
a2enmod disk_cache

/etc/init.d/apache2 restart 

Para asegurarnos de que nuestro directorio de caché /var/cache/apache2/mod_disk_cache no se llene con el tiempo, tenemos que limpiarlo con el comando htcacheclean. Ese comando es parte del paquete apache2-utils que instalamos de la siguiente manera:

aptitude install apache2-utils 

Después, podemos iniciar htcacheclean como un demonio de esta manera:

htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i

Esto limpiará nuestro directorio de caché cada 30 minutos y asegurará que no crezca más de 100MB. Para aprender más sobre htcacheclean, echa un vistazo a

man htcacheclean

Por supuesto, no quieres iniciar htcacheclean manualmente cada vez que reinicias el servidor - por lo tanto, editamos /etc/rc.local…

vi /etc/rc.local

… y agregamos la siguiente línea justo antes de la línea exit 0:

| [...] /usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i [...] |

Esto iniciará htcacheclean automáticamente cada vez que inicies el servidor.

2.2 mod_mem_cache

La configuración de mod_mem_cache se encuentra en /etc/apache2/mods-available/mem_cache.conf:

vi /etc/apache2/mods-available/mem_cache.conf   

| CacheEnable mem / MCacheSize 4096 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 2048 |

Esta es la configuración predeterminada - si lo deseas, puedes modificarla. Una lista de directivas de configuración para mod_mem_cache está disponible aquí: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

Ahora habilitemos mod_cache y mod_mem_cache de la siguiente manera:

a2enmod cache
a2enmod mem_cache

/etc/init.d/apache2 restart

¡Eso es todo! Con mod_mem_cache, no tienes que limpiar ningún directorio de caché.

3 Pruebas

Desafortunadamente, mod_cache no proporciona ninguna funcionalidad de registro, lo cual es malo si quieres saber si el registro está funcionando. Por lo tanto, creo un pequeño archivo de prueba PHP, /var/www/cachetest.php, que envía encabezados HTTP que le dicen a mod_cache que debe almacenar en caché el archivo durante 300 segundos, y que simplemente imprime la marca de tiempo:

vi /var/www/cachetest.php

| "; ?> |

Ahora llama a ese archivo en un navegador - debería mostrar la marca de tiempo actual. Luego haz clic en la barra de direcciones del navegador y presiona ENTER para que la página se cargue nuevamente (no presiones F5 o el botón de recarga - esto siempre obtendrá una copia fresca del servidor en lugar de la caché) - si todo va bien, deberías seguir viendo la antigua marca de tiempo almacenada en caché. Si esperas 300 segundos, deberías obtener una copia fresca del servidor en lugar de la caché.

4 Encabezados HTTP

El almacenamiento en caché no funciona de inmediato - debes modificar tu aplicación web para que el almacenamiento en caché pueda funcionar (es posible que tu aplicación web ya soporte el almacenamiento en caché - consulta la documentación de tu aplicación para averiguarlo). mod_cache almacenará en caché las páginas web solo si los encabezados HTTP enviados por tu aplicación web le dicen que lo haga.

Aquí hay algunos ejemplos de encabezados que le dicen a mod_cache no almacenar en caché:

  • Encabezados Expires con una fecha en el pasado: “Expires: Sun, 19 Nov 1978 05:00:00 GMT”
  • Ciertos encabezados Cache-Control: “Cache-Control: no-store, no-cache, must-revalidate” o “Cache-Control: must-revalidate, max-age=0”
  • Encabezados Set-Cookie: una página no se almacenará en caché si se establece una cookie.

Así que si deseas que mod_cache almacene en caché tus páginas, modifica tu aplicación para no enviar esos encabezados.

Si deseas que mod_cache almacene en caché tus páginas, puedes establecer un encabezado Expires con una fecha en el futuro, pero la forma recomendada es usar max-age:

"Cache-Control: must-revalidate, max-age=300"

Esto le dice a mod_cache que almacene en caché la página durante 300 segundos (max-age) - desafortunadamente, mod_cache no conoce la opción s-maxage (ver http://www.mnot.net/cache_docs/#CACHE-CONTROL), por eso debemos usar la opción max-age (que también le dice a tu navegador que almacene en caché - ten esto en cuenta si obtienes resultados inesperados). Si mod_cache conociera la opción s-maxage, podríamos usar “Cache-Control: must-revalidate, max-age=0, s-maxage=300” que le diría a mod_cache, pero no al navegador, que almacene en caché la página.

Por supuesto, este encabezado es inútil si envías uno de los encabezados que no almacenan en caché (Expires en el pasado, Set-Cookie, etc.) al mismo tiempo.

Otro encabezado muy importante para el almacenamiento en caché es este:

"Vary: Accept-Encoding"

Esto hace que mod_cache mantenga dos copias de cada página almacenada en caché, una comprimida (gzip) y una descomprimida, para que pueda entregar la versión correcta dependiendo de las capacidades del agente de usuario/navegador. Algunos agentes de usuario no entienden la compresión gzip, por lo que deberían obtener la versión descomprimida.

Así que aquí está el resumen: usa los siguientes dos encabezados si deseas que mod_cache almacene en caché:

“Cache-Control: must-revalidate, max-age=300”
“Vary: Accept-Encoding”

y asegúrate de que no se envíe ningún Expires con una fecha en el pasado, cookies, etc.

Si tu aplicación está escrita en PHP, puedes usar la función header() de PHP para enviar encabezados HTTP, por ejemplo, así:

header(“Cache-Control: must-revalidate, max-age=300”);
header(“Vary: Accept-Encoding”);

Esta página es una lectura obligada si deseas aprender más sobre encabezados HTTP y almacenamiento en caché: http://www.mnot.net/cache_docs/

5 Enlaces

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.