Tabla de Contenidos

ESI (Edge Side Includes)


Presentación de la problemática

En plataformas web más o menos complejas podemos encontrarnos con que cada página en sí está formada por diferentes "bloques" con diferentes características.

Por ejemplo, una página web que contenga una noticia en un periódico online puede estar formada por:



Veamos un "diagrama" del anterior ejemplo:



Cachear este tipo de páginas es complicado a priori porque cada "bloque" necesitaría en realidad de un tiempo de vida específico:



Con una página de estas características, nos tenemos que amoldar al menor TTL disponible. En este caso, no podríamos cachearla si el banner debe de cambiar para cada usuario (por ejemplo, publicidad "contextual" basada en una cookie), o podríamos tomar como cacheo mínimo global 3 segundos si no nos importa que durante 3 segundos, todos los usuarios de nuestra web reciban el mismo banner y que éste pueda cambiar a los 3 segundos para el siguiente "ciclo de cacheo" (esto es lo que se conoce como microcacheo).


Lenguaje ESI

Edge Side Includes es un lenguaje diseñado para incluir vía HTTP fragmentos de páginas web en otras páginas web.

El principal objetivo de ESI son aquellas webs que comparten contenido entre páginas, como cajetines de comentarios, TOP-N, "widgets", marcadores, etc y que se tienen que generar una y otra vez para cada petición de las páginas, impidiendo además un correcto cacheo del resultado global.

ESI permite definir una "estructura" de página donde se incluyen el resto de páginas vía HTTP de forma que se puedan definir diferentes tiempos de cacheo para cada "bloque" que compone la página final.

Varnish soporta los siguientes 3 tags de ESI, y no :



Estos tags serán ignorados dentro de comentarios HTML del tipo <!-- y -->.


Estructura de un documento ESI

La estructura de nuestro ejemplo en formato ESI podría ser similar a la siguiente:

<HTML>
<BODY>
<esi:include src="/cabecera.php"/>
<esi:include src="/ad_banner.php"/>
<esi:include src="/articulo.php"/>
<esi:include src="/top10.php"/>
<esi:include src="/comments.php"/>
</BODY>
</HTML>

La particularidad del código ESI es que cada "include" se reemplaza por la salida del fetch del elemento en cuestión, donde cada elemento es tratado como un elemento de caché diferente:



Tras definir la página, tenemos que agregar el código VCL que permite este procesamiento:

sub vcl_fetch 
{
    if (req.url == "/noticia.html") 
    {
       # Iniciar procesado ESI para este documento:
       set beresp.do_esi = true;

       # Establecer TTL para el propio documento ESI en sí:
       set beresp.ttl = 24 h;
    } 
    elseif (req.url == "/cabecera.php") 
    {
       set beresp.ttl = 1d;
       return(lookup);
    }
    elseif (req.url == "/banner.php") 
    {
       return(pass);
    }
    # (etc...)
}

Las reglas para el uso de ESI son:





<Volver a Página de VARNISH>