Mejore el rendimiento de su sitio web habilitando el almacenamiento en caché en Apache

Resumen

La mayoría de los sitios web tienen grandes cantidades de contenido que permanece inalterado o que rara vez se modifica después de su publicación. Y cada vez que se solicita al servidor web, modificado o no, se vuelve a procesar y transmitir al cliente, consumiendo innecesariamente valiosos recursos del sistema y ancho de banda de la red. A medida que su sitio web o aplicación gana en popularidad, más demanda se pone en su servidor para procesar el contenido que es, aunque generado dinámicamente, estático.

Esto no es un uso eficiente de los recursos y eventualmente terminará costando mucho dinero, ya que se instala más hardware para mantener la carga. Aquí es donde entra la caché. No desperdiciemos ciclos de CPU o RAM procesando contenidos a los que se ha accedido previamente y que probablemente no cambiarán en un tiempo determinado. En su lugar, serviremos contenido preprocesado, almacenado temporalmente en el servidor o en la caché de los navegadores web. Y sólo después de que el contenido haya sido modificado o haya pasado una cantidad de tiempo determinada volveremos a procesar el contenido solicitado.

Configurar la caché en Apache

Apache viene con tres módulos para el almacenamiento de contenido en caché, uno lo habilita y los dos restantes determinan dónde existe el almacén de caché: en el disco o en la memoria. La determinación de qué módulo utilizar para el almacenamiento en caché depende de los recursos de hardware disponibles y de los requisitos de rendimiento.

Servir desde el disco es lento pero menos costoso. Servir desde la memoria es rápido, pero caro – tanto en coste como en consumo de recursos. Sin embargo, puede aumentar el rendimiento de la caché de disco colocándola en el almacenamiento SSDFLASH en lugar del disco giratorio convencional.

  1. Asegúrese de que el módulo de caché está siendo cargado por Apache, verificando que la siguiente línea existe en el archivo de configuración del servidor de Apache, sin comentar.
    LoadModule cache_module modules/mod_cache.so
  2. Para la caché de disco, asegúrese de que el módulo disk_cache_module está siendo cargado por Apache. Busque la siguiente línea, sin comentar.
    LoadModule disk_cache_module modules/mod_disk_cache.so
  3. Añada las siguientes líneas en el archivo de configuración del servidor Apache (para global) o dentro de una directiva VirtualHost (aplicación localizada).
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-admin

    CacheEnable disk /

    Desactiva el almacenamiento en caché en disco para el directorio relativo «/».

    Cacheroot

    Establezca el directorio de almacenamiento de la caché, donde se guardará todo el contenido almacenado en la caché.

    CacheDefaultExpire

    Establezca la fecha de caducidad por defecto, relativa a la fecha de solicitud original, en segundos.

    CacheDisable

    Desactiva la caché para las rutas relativas que siguen la opción. Las áreas sensibles y las que no deben ser almacenadas en caché deben añadirse aquí.

Configuración de la caducidad del contenido

El almacenamiento en caché requiere una fecha de caducidad para que funcione. Sin una fecha de caducidad en su contenido, la caché no puede determinar si está caducado o no.

Utilice Mod_Expires de Apache

Este módulo le permite definir las fechas de caducidad de su contenido, en su conjunto o individualmente en función del tipo o de la cadena de coincidencia.

  1. Asegúrese de que el módulo se está cargando en Apache. Abra el archivo de configuración del servidor (httpd.conf en CentOS) y busque esta línea. Descoméntala, si está comentada con un ‘#’.
    LoadModule expires_module modules/mod_expires.so
  2. Añade las siguientes líneas a la configuración del servidor Apache, a una configuración de host virtual, a una directiva de directorio o a .htaccess, dependiendo de dónde quiera establecer su política de almacenamiento en caché.
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day"</IfModule></pre>

    ExpiresActive On

    Activa la caducidad del mod.

    ExpiresDefault

    Establece la fecha de caducidad por defecto para todo el contenido. Acceso más 1 día establece el tiempo de caducidad a la hora de acceso del contenido + 1 día, lo que significa que se almacenará en caché durante 24 horas.

  3. Si desea asignar diferentes valores de caducidad a tipos de contenido específicos, puede utilizar la opción ExpiresByType, además de la opción ExpiresDefault o sin ella. Estos son algunos ejemplos:
    <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 day" ExpiresByType image/jpg "access plus 5 days" ExpiresByType image/jpeg "access plus 5 days" ExpiresByType image/gif "access plus 5 days" ExpiresByType image/png "access plus 5 days" ExpiresByType text/css "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresByType image/x-icon "access plus 1 year"</IfModule>

Utilizar cabeceras HTTP en la aplicación web

Las fechas de caducidad y de última modificación pueden ser definidas por la aplicación web utilizando parámetros de cabecera HTTP. Esto da el control de la frescura del contenido a los desarrolladores o a la aplicación. La forma de hacerlo depende de su aplicación.

  • HTML
    Use la etiqueta Meta y defina la edad del contenido. En el ejemplo siguiente, establezca la caché como privada (sólo para el cliente solicitante) y la edad máxima a 1 hora (3600 segundos).
    <meta http-equiv="Cache-control" content="private,max-age:3600">
  • PHP
    Utilice la función Header() para establecer la edad del contenido en la cabecera de los documentos.
    header("Cache-Control: private, max-age=3600");

Caché de contenido sin caducidad

A veces necesita cachear contenido que no tiene una fecha de caducidad establecida. Como se ha mencionado anteriormente, las fechas de caducidad son un requisito para que el mecanismo de caché funcione, por defecto. Sin embargo, podemos instruir a Apache para que añada una fecha de caducidad por defecto a los contenidos que no tienen definida una fecha de caducidad, y los almacene en caché. La opción CacheIgnoreNoLastMod nos permite hacer esto.

  1. Añada la opción CacheIgnoreNoLastMod con un valor de On a la ubicación donde haya habilitado el almacenamiento en caché – el archivo de configuración del servidor de Apache o un archivo de configuración de Virtual Hosts.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod On

Impedir que los navegadores almacenen el contenido en caché

El problema con las configuraciones de caché anteriores es que el contenido de su aplicación se almacena en caché en dos ubicaciones: en el cliente y en el servidor. Si actualizas tu contenido y quieres que el usuario lo vea inmediatamente, es posible que no pueda hacerlo si su versión cacheada localmente no ha expirado. Puede acortar el tiempo de caducidad, pero entonces puede anular el propósito del almacenamiento en caché por completo.

Tome el control total del almacenamiento en caché, en cambio, habilitándolo sólo en el servidor. Obligue al navegador a obtener el contenido del servidor para cada solicitud, pero sirva el contenido Java o PHP preprocesado, por ejemplo, a menos que el contenido haya sido modificado. Esto asegura que el usuario siempre vea la versión más reciente, a la vez que no desperdicia ciclos de CPU o RAM reprocesando innecesariamente.

  1. Agregar la opción CacheIgnoreCacheControl a la ubicación que tenga habilitado el almacenamiento en caché – el archivo de configuración del servidor de Apache o la configuración de un host virtual – con un valor de On . Esto hace que Apache ignore las peticiones de actualización de contenido del navegador. Todo el contenido se servirá desde la caché del servidor, siempre que sea posible, hasta que haya expirado.
    CacheEnable disk /CacheRoot /webapps/cache/app1CacheDefaultExpire 3600CacheDisable /wp-adminCacheIgnoreNoLastMod OnCacheIgnoreCacheControl On
  2. Guarda tus cambios.
  3. Reinicia Apache para aplicar tus cambios.

WordPress y otros frameworks de aplicaciones

Los frameworks, como el de WordPress y otros similares a CodeIgniter, dirigen todo el contenido a través de Index.php. Dependiendo de cómo hayas escrito tus reglas de mod_rewrite, tu contenido en caché se mostrará de forma incorrecta. Usted puede encontrar que el contenido de una página solicitada, categoría, etc, se muestra en lugar de lo que realmente se solicitó.

Para combatir esto, tenemos que asegurarnos de que la caché de Apache considera los parámetros añadidos al final del index.php cuando el contenido se almacena en caché y se extrae. Modifique la regla de reescritura para index.php, como se ve en el ejemplo siguiente.

# WordPress Permalink rewritesRewriteBase /RewriteRule ^index.php$ – RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php/ 

Deja un comentario