Cómo configurar el almacenamiento en caché de contenido de Apache en Ubuntu 14.04

¿Qué es el almacenamiento en caché?

El almacenamiento en caché es un método para mejorar el rendimiento del servidor permitiendo que el contenido más solicitado se almacene temporalmente de una manera que permita un acceso más rápido. Esto acelera el procesamiento y la entrega al eliminar algunas operaciones que consumen muchos recursos.

Al crear reglas efectivas de almacenamiento en caché, el contenido que es adecuado para el almacenamiento en caché será almacenado para mejorar los tiempos de respuesta, conservar los recursos y minimizar la carga. Apache proporciona una variedad de cachés adecuados para acelerar diferentes tipos de operaciones. En esta guía, hablaremos de cómo configurar Apache 2.4 en Ubuntu 14.04 utilizando sus diversos módulos de almacenamiento en caché.

Para aprender más sobre el desarrollo de estrategias generales de almacenamiento en caché, consulte este artículo.

Una introducción al almacenamiento en caché en Apache

Apache puede almacenar en caché contenido con diferentes niveles de sofisticación y escalabilidad. El proyecto los divide en tres grupos según el método en el que se cachea el contenido. El desglose general es:

  • Caché de archivos: La estrategia de caché más básica, esto simplemente abre archivos o descriptores de archivos cuando el servidor se inicia y los mantiene disponibles para acelerar el acceso.
  • Caché de clave-valor: Utilizado principalmente para el caché de SSL y de autenticación, el caché de clave-valor utiliza un modelo de objeto compartido que puede almacenar elementos que son costosos de calcular repetidamente.
  • Caché HTTP estándar: El mecanismo de caché más flexible y generalmente útil, este sistema de tres estados puede almacenar respuestas y validarlas cuando expiran. Esto puede ser configurado para el rendimiento o la flexibilidad en función de sus necesidades específicas.

Un rápido vistazo a las descripciones anteriores puede revelar que los métodos anteriores tienen un cierto solapamiento, pero también que puede ser útil utilizar más de una estrategia al mismo tiempo. Por ejemplo, el uso de un almacén de valores clave para sus sesiones SSL y la habilitación de una caché HTTP estándar para las respuestas podría permitirle quitarle una carga significativa a sus fuentes de datos y acelerar muchas operaciones de entrega de contenido para sus clientes.

Ahora que tiene una amplia comprensión de cada uno de los mecanismos de almacenamiento en caché de Apache, veamos estos sistemas con más detalle.

Caché de archivos

Resumen general

  • Módulos principales involucrados: mod_file_cache
  • Principales casos de uso: almacenar ya sea el contenido de los archivos o los descriptores de archivos cuando el servidor se inicia. Se trata de representaciones estáticas que no pueden cambiarse de forma fiable hasta que se reinicie el servidor.
  • Características: simple, mejora el rendimiento de los sistemas de archivos lentos
  • Inconvenientes: característica experimental, no responde a las actualizaciones del sistema de archivos, debe utilizarse con moderación para ajustarse a las limitaciones del sistema operativo, sólo puede utilizarse en archivos estáticos

Los detalles

El módulo mod_file_cache se utiliza principalmente para acelerar el acceso a los archivos en servidores con sistemas de archivos lentos. Proporciona una selección de dos directivas de configuración, ambas destinadas a acelerar el proceso de servir archivos estáticos realizando parte del trabajo cuando se inicia el servidor en lugar de cuando se solicitan los archivos.

La directiva CacheFile se utiliza para especificar la ruta de acceso a los archivos en el disco a los que se desea acelerar el acceso. Cuando se inicia Apache, éste abrirá los ficheros estáticos que se hayan especificado y guardará en caché el manejador del fichero, evitando la necesidad de abrir el fichero cuando se solicite. El número de ficheros que se pueden abrir de esta manera está sujeto a las limitaciones establecidas por su sistema operativo.

La directiva MMapFile también abre ficheros cuando Apache se inicia por primera vez. Sin embargo, MMapFile almacena en caché el contenido del archivo en la memoria en lugar de sólo el manejador de archivos. Esto permite un rendimiento más rápido para esas páginas, pero tiene algunas limitaciones importantes. No mantiene ningún registro de la cantidad de memoria que ha utilizado, por lo que es posible que se quede sin memoria. También hay que tener en cuenta que los procesos hijos copiarán cualquier parte de la memoria asignada, lo que puede dar lugar a un agotamiento de los recursos más rápido de lo que inicialmente se puede prever. Use esta directiva con moderación.

Estas directivas se evalúan solamente cuando Apache se inicia. Esto significa que no puede confiar en que Apache recoja los cambios realizados después de que se haya iniciado. Utilícelas solamente en archivos estáticos que no van a cambiar durante el tiempo que dure la sesión de Apache. Dependiendo de cómo se modifiquen los ficheros, el servidor puede ser notificado de los cambios, pero este no es el comportamiento esperado y no siempre funcionará correctamente. Si es necesario hacer cambios en los ficheros que se pasan a estas directivas, reinicie Apache después de hacer los cambios.

Cómo activar la caché de ficheros

La caché de ficheros la proporciona el módulo mod_file_cache. Para utilizar esta funcionalidad, tendrá que habilitar el módulo.

Cuando se ejecuta Ubuntu 14.04, el módulo se instalará pero se deshabilitará al instalar Apache. Puede habilitar el módulo escribiendo:

  • sudo a2enmod file_cache

Después, debe editar el archivo de configuración principal para establecer sus directivas de almacenamiento en caché de archivos. Abra el archivo escribiendo:

  • sudo nano /etc/apache2/apache2.conf

Para configurar el almacenamiento en caché del manejo de archivos, utilice la directiva CacheFile. Esta directiva toma una lista de rutas de archivos, separadas por espacios, así:

/etc/apache2/apache2.conf
CacheFile /var/www/html/index.html /var/www/html/somefile.index

Cuando el servidor se reinicie, Apache abrirá los archivos listados y almacenará sus manejadores de archivo en la caché para un acceso más rápido.

Si, en cambio, desea mapear algunos archivos directamente en la memoria, puede utilizar la directiva MMapFile. Su sintaxis es básicamente la misma que la de la última directiva, en el sentido de que simplemente toma una lista de rutas de archivos:

/etc/apache2/apache2.conf
MMapFile /var/www/html/index.html /var/www/html/somefile.index

En la práctica, no habría ninguna razón para configurar tanto CacheFile como MMapFile para el mismo conjunto de archivos, pero podría utilizar ambos en diferentes conjuntos de archivos.

Cuando haya terminado, puede guardar y cerrar los archivos. Compruebe la sintaxis del fichero de configuración escribiendo:

  • sudo apachectl configtest

Si la última línea dice Syntax OK, puede reiniciar con seguridad su instancia de Apache:

  • sudo service apache2 restart

Apache se reiniciará, almacenando en caché el contenido de los ficheros o los manejadores dependiendo de las directivas que haya utilizado.

Caché de valores clave

Resumen general

  • Módulos principales implicados: mod_socache_dbm, mod_socache_dc, mod_socache_memcache, mod_socache_shmcb
  • Módulos de apoyo implicados: mod_authn_socache, mod_ssl
  • Casos de uso principales: almacenamiento de sesiones SSL o detalles de autenticación, grapado SSL
  • Características: caché de objetos compartidos para almacenar recursos complejos, puede ayudar en el cacheado y grapado de sesiones SSL, backends flexibles
  • Inconvenientes: no tiene mecanismos de validación, necesidad de configurar un software separado para backends más performantes/flexibles, algunos errores en el código

Los detalles

La caché de valores clave es más compleja que la caché de archivos y tiene beneficios más focalizados. También conocida como caché de objetos compartidos, la caché de clave-valor de Apache se utiliza principalmente para evitar la repetición de las costosas operaciones relacionadas con la configuración del acceso de un cliente al contenido, en lugar del propio contenido. Específicamente, se puede utilizar para almacenar en caché los detalles de autenticación, las sesiones SSL, y para proporcionar el grapado SSL.

Nota

Actualmente, hay algunos problemas con cada proveedor de caché de objetos compartidos. Las referencias a los problemas se describirán a continuación. Téngalos en cuenta cuando evalúe si desea habilitar esta función.

El almacenamiento en caché real se lleva a cabo mediante el uso de uno de los módulos de proveedor de caché de objetos compartidos. Estos son:

  • mod_socache_dbm: Este backend utiliza el motor de base de datos simple dbm, que es un almacén de valores clave basado en archivos que hace uso de hash y cubos de tamaño fijo. Este proveedor sufre algunas fugas de memoria, por lo que para la mayoría de los casos se recomienda utilizar mod_socache_shmcb en su lugar.
  • mod_socache_dc: Este proveedor utiliza el software de caché de sesión distcache. Este proyecto no se ha actualizado desde 2004 y ni siquiera está empaquetado para algunas distribuciones, por lo que hay que utilizarlo con una buena dosis de precaución.
  • mod_socache_memcache: Este utiliza la caché de objetos de memoria distribuida memcache para almacenar elementos. Esta es la mejor opción para una caché distribuida entre múltiples servidores. Actualmente, no expira correctamente las entradas, pero un parche fue comprometido en el tronco del control de versiones de Apache que corrige el problema.
  • mod_socache_shmcb: Actualmente, esta es la mejor opción para el almacenamiento en caché de valores clave. Esto almacena en caché un buffer cíclico en la memoria compartida, que eliminará las entradas a medida que se llene. Actualmente se ahoga en las entradas de más de 11k de tamaño.

Además de los módulos de proveedores anteriores, se necesitarán módulos adicionales dependiendo de los objetos que se almacenen en caché. Por ejemplo, para almacenar en caché las sesiones SSL o para configurar el grapado SSL, se debe habilitar mod_ssl, que proporcionará las directivas SSLSessionCache y SSLStaplingCache respectivamente. Del mismo modo, para configurar el almacenamiento en caché de la autenticación, el módulo mod_authn_socache debe estar habilitado para que la directiva AuthnCacheSOCache pueda establecerse.

Cómo habilitar el almacenamiento en caché de clave-valor

Con los errores y advertencias anteriores en mente, si todavía desea configurar este tipo de almacenamiento en caché en Apache, siga a lo largo de abajo.

El método utilizado para configurar el almacenamiento en caché de clave-valor dependerá de para qué se utilizará y qué proveedor está utilizando. A continuación, repasaremos los fundamentos de la caché de autenticación y de la caché de sesión SSL.

Actualmente, hay un error con la caché de autenticación que impide pasar argumentos al proveedor de caché. Así que cualquier proveedor que no proporcione una configuración predeterminada a la que recurrir tendrá problemas.

Caché de autenticación

El caché de autenticación es útil si se utiliza un método de autenticación caro, como LDAP o autenticación de base de datos. Estos tipos de operaciones pueden tener un impacto significativo en el rendimiento si el backend debe ser golpeado cada vez que se hace una solicitud de autenticación.

Establecer el almacenamiento en caché implica modificar su configuración de autenticación existente (no vamos a cubrir cómo configurar la autenticación en esta guía). Las modificaciones en sí mismas serán prácticamente las mismas independientemente del método de autenticación del backend. Usaremos mod_socache_shmcb para nuestra demostración.

Primero, habilite el módulo authn_socache y el módulo proveedor mod_socache_shmcb escribiendo:

  • sudo a2enmod authn_socache
  • sudo a2enmod socache_shmcb

Abra su archivo de configuración principal de Apache para que pueda especificar este backend de caché compartido para su uso con la autenticación:

  • sudo nano /etc/apache2/apache2.conf

Dentro, hacia la parte superior del archivo, añada la directiva AuthnCacheSOCache. Especifica que shmcb debe ser usado como proveedor. Si el error discutido anteriormente que impide el paso de opciones está arreglado para cuando lea esto, puede especificar una ubicación y un tamaño para la caché. El número está en bytes, por lo que el ejemplo comentado dará como resultado una caché de 512 kilobytes:

/etc/apache2/apache2.conf
AuthnCacheSOCache shmcb# If the bug preventing passed arguments to the provider gets fixed,# you can customize the location and size like this#AuthnCacheSOCache shmcb:${APACHE_RUN_DIR}/auth_cache(512000)

Guarda y cierra el archivo cuando hayas terminado.

A continuación, abre la página de configuración de tu host virtual que tenga configurada la autenticación. Supondremos que está utilizando la configuración de host virtual 000-default.conf, pero debería modificarla para reflejar su entorno:

  • sudo nano /etc/apache2/sites-enabled/000-default.conf

En la ubicación donde ha configurado la autenticación, modifique el bloque para añadir el almacenamiento en caché. Específicamente, necesitas añadir el AuthnCacheProvideFor para indicarle qué fuentes de autenticación debe almacenar en caché, añadir un tiempo de espera de caché con AuthnCacheTimeout, y añadir socache a la lista AuthBasicProvider por delante de tu método de autenticación convencional. El resultado será algo así:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> . . . <Directory /var/www/html/private> AuthType Basic AuthName "Restricted Files" AuthBasicProvider socache file AuthUserFile /etc/apache2/.htpasswd AuthnCacheProvideFor file AuthnCacheTimeout 300 Require valid-user </Directory></VirtualHost>

El ejemplo anterior es para la autenticación de archivos, que probablemente no se beneficiará mucho de la caché. Sin embargo, la implementación debería ser muy similar cuando se utilizan otros métodos de autenticación. La única diferencia sustancial sería que donde está la especificación «archivo» en el ejemplo anterior, se usaría el otro método de autenticación en su lugar.

Guardar y cerrar el archivo. Reinicie Apache para implementar los cambios en la caché:

  • sudo service apache2 restart

Caché de sesión SSL

El handshake que debe realizarse para establecer una conexión SSL conlleva una sobrecarga significativa. Por lo tanto, el almacenamiento en caché de los datos de la sesión para evitar este paso de inicialización para las solicitudes posteriores puede eludir potencialmente esta penalización. La caché de objetos compartidos es un lugar perfecto para esto.

Si usted tiene SSL ya configurado para su servidor Apache, mod_ssl estará habilitado. En Ubuntu, esto significa que un archivo ssl.conf se ha movido al directorio /etc/apache2/mods-enabled. Esto en realidad ya configura el almacenamiento en caché. Dentro, verá algunas líneas como esta:

/etc/apache2/mods-enabled/ssl.conf
. . .SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)SSLSessionCacheTimeout 300. . .

Esto es realmente suficiente para configurar la caché de sesión. Para probarlo, puede utilizar el cliente de conexión de OpenSSL. Escriba:

  • openssl s_client -connect 127.0.0.1:443 -reconnect -no_ticket | grep Session-ID

Si el ID de sesión es el mismo en todos los resultados, su caché de sesión está funcionando correctamente. Presione CTRL-C para salir de nuevo a la terminal.

Caché HTTP estándar

Resumen general

  • Módulos principales involucrados: mod_cache
  • Módulos de apoyo implicados: mod_cache_disk, mod_cache_socache
  • Principales casos de uso: Almacenamiento en caché de contenido general
  • Características: Puede interpretar correctamente las cabeceras de caché HTTP, puede revalidar las entradas antiguas, puede desplegarse para obtener la máxima velocidad o flexibilidad dependiendo de sus necesidades
  • Inconvenientes: Puede filtrar datos sensibles si se configura de forma incorrecta, debe utilizar módulos adicionales para configurar correctamente la política de almacenamiento en caché

Los detalles

El protocolo HTTP fomenta y proporciona los mecanismos para el almacenamiento en caché de las respuestas a lo largo de la ruta de entrega del contenido. Cualquier ordenador que toque el contenido puede potencialmente almacenar en caché cada elemento durante una cierta cantidad de tiempo dependiendo de las políticas de almacenamiento en caché establecidas en los orígenes del contenido y de las propias reglas de almacenamiento en caché del ordenador.

El mecanismo de almacenamiento en caché HTTP de Apache almacena en caché las respuestas de acuerdo con las políticas de almacenamiento en caché HTTP que ve. Se trata de un sistema de caché de propósito general que se adhiere a las mismas reglas que seguiría cualquier servidor intermediario que tenga que ver con la entrega. Esto hace que este sistema sea muy flexible y potente y le permite aprovechar las cabeceras que ya debería estar configurando en su contenido (veremos cómo hacerlo más adelante).

La caché HTTP de Apache también se conoce como una caché de «tres estados». Esto se debe a que el contenido que ha almacenado puede estar en uno de los tres estados. Puede estar fresco, lo que significa que se puede servir a los clientes sin más comprobaciones, puede estar caducado, lo que significa que el TTL del contenido ha expirado, o puede ser inexistente si el contenido no se encuentra en la caché.

Si el contenido se vuelve caduco, en la siguiente petición, la caché puede revalidarlo comprobando el contenido en el origen. Si no ha cambiado, puede restablecer la fecha de frescura y servir el contenido actual. Si no, obtiene el contenido cambiado y lo almacena durante el tiempo permitido por su política de caché.

Resumen del módulo

La lógica de la caché HTTP está disponible a través del módulo mod_cache. El almacenamiento en caché real se realiza con uno de los proveedores de caché. Normalmente, la caché se almacena en el disco utilizando el módulo mod_cache_disk, pero la caché de objetos compartidos también está disponible a través del módulo mod_cache_socache.

El módulo mod_cache_disk almacena la caché en el disco, por lo que puede ser útil si está proxyando el contenido desde una ubicación remota, generándolo desde un proceso dinámico, o simplemente tratando de acelerar las cosas mediante el almacenamiento en caché en un disco más rápido que su contenido normalmente reside en. Este es el proveedor más probado y probablemente debería ser su primera opción en la mayoría de los casos. La caché no se limpia automáticamente, por lo que una herramienta llamada htcacheclean debe ser ejecutada ocasionalmente para adelgazar la caché. Esto puede ser ejecutado manualmente, configurado como un trabajo regular cron, o ejecutado como un demonio.

El módulo mod_cache_socache almacena en caché a uno de los proveedores de objetos compartidos (los mismos discutidos en la última sección). Esto puede tener potencialmente un mejor rendimiento que mod_cache_disk (dependiendo del proveedor de caché compartido que se seleccione). Sin embargo, es mucho más nuevo y depende de los proveedores de objetos compartidos, que tienen los fallos comentados anteriormente. Se recomienda realizar pruebas exhaustivas antes de implementar la opción mod_cache_socache.

Colocación de la caché HTTP

La caché HTTP de Apache puede desplegarse en dos configuraciones diferentes dependiendo de sus necesidades.

Si la opción CacheQuickHandler se establece en «on», la caché se comprobará muy temprano en el proceso de gestión de peticiones. Si el contenido se encuentra, se servirá directamente sin ninguna otra manipulación. Esto significa que es increíblemente rápido, pero también significa que no permite procesos como la autentificación del contenido. Si hay contenido en su caché que normalmente requiere autenticación o control de acceso, será accesible para cualquiera sin autenticación si el CacheQuickHandler se establece en «on».

Básicamente, esto emula una caché separada frente a su servidor web. Si su servidor web necesita hacer cualquier tipo de comprobación condicional, autenticación o autorización, esto no sucederá. Apache ni siquiera evaluará las directivas dentro de los bloques <Location> o <Directory>. Tenga en cuenta que CacheQuickHandler está configurado como «on» por defecto!

Si CacheQuickHandler está configurado como «off», la caché se comprobará significativamente más tarde en la secuencia de procesamiento de peticiones. Piense en esta configuración como la colocación de la caché entre su lógica de procesamiento de Apache y su contenido real. Esto permitirá que las directivas de procesamiento convencionales se ejecuten antes de recuperar el contenido de la caché. Configurando esto en «off» se intercambia un poco de velocidad por la capacidad de procesar las solicitudes más profundamente.

Cómo configurar el almacenamiento en caché HTTP estándar

Para habilitar el almacenamiento en caché, necesitará habilitar el módulo mod_cache así como uno de sus proveedores de almacenamiento en caché. Como dijimos anteriormente, mod_cache_disk está bien probado, así que nos basaremos en eso.

Habilitar los módulos

En un sistema Ubuntu, puede habilitar estos módulos escribiendo:

  • sudo a2enmod cache
  • sudo a2enmod cache_disk

Esto habilitará la funcionalidad de la caché la próxima vez que se reinicie el servidor.

También tendrá que instalar el paquete apache2-utils, que contiene la utilidad htcacheclean utilizada para reducir la caché cuando sea necesario. Puede instalarlo escribiendo:

  • sudo apt-get update
  • sudo apt-get install apache2-utils

Modificación de la configuración global

La mayor parte de la configuración para el almacenamiento en caché tendrá lugar dentro de las definiciones de hosts virtuales individuales o bloques de ubicación. Sin embargo, al habilitar mod_cache_disk también se habilita una configuración global que puede utilizarse para especificar algunos atributos generales. Abra ese archivo ahora para echarle un vistazo:

  • sudo nano /etc/apache2/mods-enabled/cache_disk.conf

Con los comentarios eliminados, el archivo debería tener el siguiente aspecto:

/etc/apache2/mods-enabled/cache_disk.conf
<IfModule mod_cache_disk.c> CacheRoot /var/cache/apache2/mod_cache_disk CacheDirLevels 2 CacheDirLength 1</IfModule>

La envoltura IfModule le dice a Apache que sólo se preocupe de estas directivas si el módulo mod_cache_disk está activado. La directiva CacheRoot especifica la ubicación en el disco donde se mantendrá la caché. Las directivas CacheDirLevels y CacheDirLength contribuyen a definir cómo se construirá la estructura de directorios de la caché.

Se creará un hash md5 de la URL que se está sirviendo como la clave utilizada para almacenar los datos. Los datos se organizarán en directorios derivados de los caracteres iniciales de cada hash. CacheDirLevels especifica el número de subdirectorios a crear y CacheDirLength especifica cuántos caracteres usar como nombre de cada directorio. Así que un hash de b1946ac92492d2347c6235b4d2611184 con los valores por defecto mostrados arriba se archivaría en una estructura de directorios de b/1/946ac92492d2347c6235b4d2611184. Normalmente, no necesitarás modificar estos valores, pero es bueno saber para qué se utilizan.

Nota

Si decides modificar el valor deCacheRoot, tendrás que abrir el archivo/etc/default/apache2y modificar el valor deHTCACHECLEAN_PATHpara que coincida con tu selección. Esto se utiliza para limpiar la caché a intervalos regulares, por lo que debe tener la ubicación correcta de la caché.

Algunos otros valores que puede establecer en este archivo son CacheMaxFileSize y CacheMinFileSize que establecen los rangos de tamaños de archivo en bytes que Apache comprometerá a la caché, así como CacheReadSize y CacheReadTime, que le permite esperar y almacenar el contenido antes de enviarlo al cliente. Esto puede ser útil si el contenido reside en otro lugar que no sea este servidor.

Modificación del servidor virtual

La mayor parte de la configuración para el almacenamiento en caché ocurrirá en un nivel más granular, ya sea en la definición del host virtual o en un bloque de ubicación específico.

Abra uno de sus archivos de host virtual para seguir. Supondremos que está utilizando el archivo predeterminado en esta guía:

  • sudo nano /etc/apache2/sites-enabled

En el bloque de host virtual, fuera de cualquier bloque de ubicación, podemos comenzar a configurar algunas de las propiedades de almacenamiento en caché. En esta guía, vamos a suponer que queremos desactivar el CacheQuickHandler para que se haga más procesamiento. Esto nos permite subir reglas de caché más completas.

También aprovecharemos esta oportunidad para configurar el bloqueo de la caché. Se trata de un sistema de bloqueos de archivos que Apache utilizará cuando esté consultando con el origen del contenido para ver si éste sigue siendo válido. Durante el tiempo en que se satisface esta consulta, si entran peticiones adicionales para el mismo contenido, se producirían peticiones adicionales al recurso del backend, lo que podría causar picos de carga.

Configurar un bloqueo de caché para un recurso durante la validación indica a Apache que el recurso se está refrescando en ese momento. Durante este tiempo, el recurso rancio puede ser servido con una cabecera de advertencia indicando su estado. Configuraremos esto con un directorio de bloqueo de caché en la carpeta /tmp. Dejaremos un máximo de 5 segundos para que un bloqueo se considere válido. Estos ejemplos están tomados directamente de la documentación de Apache, así que deberían funcionar bien para nuestros propósitos.

También le diremos a Apache que ignore las cabeceras Set-Cookie y no las almacene en la caché. Esto evitará que Apache filtre accidentalmente cookies específicas del usuario a otras partes. La cabecera Set-Cookie se eliminará antes de que las cabeceras se almacenen en la caché.

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie</VirtualHost>

Todavía tenemos que habilitar realmente la caché para este host virtual. Podemos hacerlo con la directiva CacheEnable. Si esto se establece en un bloque de host virtual, tendríamos que proporcionar el método de almacenamiento en caché (disk o socache), así como los URIs solicitados que deben ser almacenados en caché. Por ejemplo, para almacenar en caché todas las respuestas, esto podría establecerse como CacheEnable disk /, pero si sólo quieres almacenar en caché las respuestas bajo el URI /public, podrías establecerlo como CacheEnable disk /public.

Tomaremos una ruta diferente habilitando nuestra caché dentro de un bloque de ubicación específico. Hacer esto significa que no tenemos que proporcionar una ruta URI al comando CacheEnable. Cualquier URI que se sirva desde esa ubicación se almacenará en la caché. También activaremos la directiva CacheHeader para que nuestras cabeceras de respuesta indiquen si se ha utilizado la caché para servir la petición o no.

Otra directiva que estableceremos es CacheDefaultExpire para poder establecer una caducidad (en segundos) si no se establecen las cabeceras Expires ni Last-Modified en el contenido. Del mismo modo, estableceremos CacheMaxExpire para limitar la cantidad de tiempo que se guardarán los elementos. Estableceremos el CacheLastModifiedFactor para que Apache pueda crear una fecha de caducidad si tiene una fecha Last-Modified, pero sin caducidad. El factor se multiplica por el tiempo desde la modificación para establecer una caducidad razonable.

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 </Location></VirtualHost>

Guarda y cierra tu archivo cuando hayas configurado todo lo que necesitas.

Compruebe su configuración completa en busca de errores de sintaxis escribiendo:

  • sudo apachectl configtest

Si no se informa de ningún error, reinicie su servicio escribiendo:

  • sudo service apache2 restart

Configuración de caducidad y cabeceras de caché en el contenido

En la configuración anterior, hemos configurado el almacenamiento en caché HTTP, que se basa en las cabeceras HTTP. Sin embargo, ninguno de los contenidos que estamos sirviendo tiene realmente las cabeceras Expires o Cache-Control necesarias para tomar decisiones inteligentes de almacenamiento en caché. Para establecer estas cabeceras, necesitamos aprovechar algunos módulos más.

El módulo mod_expires puede establecer tanto la cabecera Expires como la opción max-age de la cabecera Cache-Control. El módulo mod_headers puede utilizarse para añadir opciones Cache-Control más específicas para afinar aún más la política de almacenamiento en caché.

Podemos habilitar ambos módulos escribiendo:

  • sudo a2enmod expires
  • sudo a2enmod headers

Después de habilitar estos módulos, podemos ir directamente a modificar nuestro archivo de host virtual de nuevo:

  • sudo nano /etc/apache2/sites-enabled/000-default.conf

El módulo mod_expires proporciona sólo tres directivas. La ExpiresActive activa el procesamiento de la caducidad en un determinado contexto poniéndolo a «on». Las otras dos directivas son muy similares entre sí. La directiva ExpiresDefault establece el tiempo de expiración por defecto, y la ExpiresByType establece el tiempo de expiración según el tipo MIME del contenido. Ambas establecerán el Expires y el Cache-Control «max-age» a los valores correctos.

Estos dos ajustes pueden tomar dos sintaxis diferentes. La primera es simplemente «A» o «M» seguida de un número de segundos. Esto establece la caducidad en relación con la última vez que el contenido fue «accedido» o «modificado» respectivamente. Por ejemplo, ambas expirarían el contenido 30 segundos después de que se accediera a él.

ExpiresDefault A30ExpireByType text/html A30

La otra sintaxis permite una configuración más verbosa. Permite utilizar unidades distintas a los segundos que son más fáciles de calcular para los humanos. También utiliza la palabra completa «acceso» o «modificación». Toda la configuración de la expiración debe mantenerse entre comillas, así:

ExpiresDefault "modification plus 2 weeks 3 days 1 hour"ExpiresByType text/html "modification plus 2 weeks 3 days 1 hour"

Para nuestros propósitos, sólo estableceremos una expiración por defecto. Empezaremos por establecerla en 5 minutos para que, si nos equivocamos al familiarizarnos, no se almacene en los ordenadores de nuestros clientes durante un tiempo extremadamente largo. Cuando estemos más seguros de nuestra capacidad para seleccionar políticas apropiadas para nuestro contenido, podemos ajustar esto a algo más agresivo:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 ExpiresActive on ExpiresDefault "access plus 5 minutes" </Location></VirtualHost>

Esto establecerá nuestra cabecera Expires a cinco minutos en el futuro y establecerá Cache-Control max-age=300. Para refinar aún más nuestra política de almacenamiento en caché, podemos utilizar la directiva Header. Podemos utilizar la opción merge para añadir opciones adicionales Cache-Control. Puedes llamar a esto varias veces y añadir las políticas adicionales que quieras. Consulta esta guía para hacerte una idea de las políticas de almacenamiento en caché que te gustaría establecer para tu contenido. Para nuestro ejemplo, sólo estableceremos «public» para que otras cachés puedan estar seguras de que se les permite almacenar copias.

Para establecer ETags para el contenido estático de nuestro sitio (para utilizarlo para la validación), podemos utilizar la directiva FileETag. Esto funcionará para el contenido estático. Para el contenido generado dinámicamente, su aplicación será responsable de generar correctamente ETags.

Utilizamos la directiva para establecer los atributos que Apache utilizará para calcular el Etag. Puede ser INode, MTime, Size, o All dependiendo de si queremos modificar el ETag cada vez que cambie el inode del fichero, su tiempo de modificación, su tamaño, o todo lo anterior. Se puede proporcionar más de un valor, y se puede modificar la configuración heredada en contextos hijos precediendo la nueva configuración con un + o -. Para nuestros propósitos, sólo usaremos «all» para que todos los cambios se registren:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined CacheQuickHandler off CacheLock on CacheLockPath /tmp/mod_cache-lock CacheLockMaxAge 5 CacheIgnoreHeaders Set-Cookie <Location /> CacheEnable disk CacheHeader on CacheDefaultExpire 600 CacheMaxExpire 86400 CacheLastModifiedFactor 0.5 ExpiresActive on ExpiresDefault "access plus 5 minutes" Header merge Cache-Control public FileETag All </Location></VirtualHost>

Esto añadirá «public» (separado por una coma) a cualquier valor Cache-Control que ya tenga e incluirá un ETag para nuestro contenido estático.

Cuando haya terminado, guarde y cierre el archivo. Compruebe la sintaxis de sus cambios escribiendo:

  • sudo apachectl configtest

Si no se encontraron errores, reinicie su servicio para implementar sus políticas de almacenamiento en caché:

  • sudo service apache2 restart

Conclusión

Configurar el almacenamiento en caché con Apache puede parecer un trabajo desalentador debido a la cantidad de opciones que hay. Por suerte, es fácil empezar de forma sencilla y luego ir creciendo a medida que se requiera más complejidad. La mayoría de los administradores no necesitarán cada uno de los tipos de caché.

Cuando configure la caché, tenga en cuenta los problemas específicos que está tratando de resolver para evitar perderse en las diferentes opciones de implementación. La mayoría de los usuarios se beneficiarán de, al menos, configurar las cabeceras. Si estás haciendo un proxy o generando contenido, configurar una caché HTTP puede ser útil. La caché de objetos compartidos es útil para tareas específicas como el almacenamiento de sesiones SSL o detalles de autenticación si estás usando un proveedor de backend. El almacenamiento en caché de archivos puede limitarse probablemente a aquellos con sistemas lentos.

Leave a Reply