Configurar Varnish 3 para uso con ESI

Una de las mejoras que me han parecido más interesantes de la última versión de Varnish ha sido la implementación del lenguaje ESI y, aunque la versión anterior ya tenia cierta compatibilidad con ESI, esta no acababa de funcionar de la manera esperada.

Diagrama de cacheo con ESIPara el que no sepa de que estoy hablando, ESI es un lenguaje de marcado que permite marcar partes de una pagina web para ser cacheadas de manera independiente del resto de la web. Imaginaros que tenéis en vuestra pagina principal de vuestra pagina web una parte que es 100% estática (logos, menus,…) y otra parte que es más dinámica (una columna con noticias por ejemplo). Los sistemas tradicionales hasta ahora solo permiten cachear una pagina entera por lo que si quisieras que se actualizara la lista de noticias, tendrías que decirle a tu sistema de cacheo que actualizara toda la pagina entera (incluso las partes que no se han modificado). Con ESI, puedes indicarle que solo actualice una parte de la web (en este caso la columna de noticias) por lo que el resto de la web no se actualizaría ahorrándonos el coste de memoria, cpu y trafico que esto conlleva.

Todavía estoy haciendo pruebas con esta tecnología pero para el que le interese y no sepa por donde empezar, aquí os dejo un ejemplo sencillo para probar:

Pongamos que tenemos 3 ficheros. El primero le llamaremos hora1.php que contendrá el siguiente código:

Descargar hora1.php
1
2
<?php $horaUnix = time(); ?>
<p><?php echo date('Y-m-d H:i:s',$horaUnix); ?></p>

Esto, si lo ejecutamos, nos mostrara la fecha y hora del sistema. Luego tenemos otro fichero que le llamaremos hora2.php que hace exactamente lo mismo. Más a delante veremos el porque.

Descargar hora2.php
1
2
<?php $horaUnix = time(); ?>
<p><?php echo date('Y-m-d H:i:s',$horaUnix); ?></p>

Y a continuación, el index.html contendría lo siguiente:

Descargar index.html
1
2
3
4
5
6
<html>
  <body>
    <esi:include src="hora1.php" />
    <esi:include src="hora2.php" />
  </body>
</html>

Bueno, llegados a este punto, más o menos os podéis hacer a la idea de por donde van los tiros. En el fichero index.html esta indicado que se han de incluir dos ficheros que harán algo (en este caso mostrar la hora del sistema).

Y ahora es donde viene lo interesante, la configuración de Varnish. Para que todo esto funcione debemos habilitar el lenguaje ESI en la configuración de Varnish y especificar el tiempo de cacheo que ha de tener las partes que queremos cachear de manera independiente. Para hacer esto tenemos que añadir en el fichero donde tengáis la configuración de Varnish (por defecto en /etc/varnish/default.vcl) el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
sub vcl_fetch {
 ...
      if (req.url == "/") { /* Si es la pagina principal */
              set beresp.do_esi = true; /* Activa el lenguaje ESI */
              set beresp.ttl = 24 h;    /* El tiempo de cacheo de la pagina principal sera de 24 horas */
      } elseif (req.url == "/hora1.php") { /* Si es la parte 1 */
              set beresp.ttl = 1m;      /* El tiempo de cacheo de este fragmento sera de 1 minuto */
      } elseif (req.url == "/hora2.php") { /* Si es la parte 2 */
              set beresp.ttl = 5m;      /* El tiempo de cacheo de este fragmento sera de 5 minutos */
      }
 ...
 }

Y ya esta, reiniciamos el servicio de Varnish y al entrar en nuestra web veremos lo siguiente:

1
2
3
4
5
6
<html>
  <body>
    <p>2011-02-01 10:12:15</p>
    <p>2011-02-01 10:12:15</p>
  </body>
</html>

Pero si esperamos 1 minuto y actualizamos veremos lo siguiente:

1
2
3
4
5
6
<html>
  <body>
    <p>2011-02-01 10:13:15</p>
    <p>2011-02-01 10:12:15</p>
  </body>
</html>

Y si esperamos 5 minutos entonces se actualizaran ambos párrafos.

Y ya esta, este es un ejemplo sencillo de como implementar ESI en vuestra web. Fijaros que el fichero principal es index.html y no index.php (aunque también funcionaria con index.php) lo he querido hacer con formato html para remarcar que no es el Apache el que compila y ejecuta el lenguaje ESI, sino Varnish. Si accediéramos directamente a nuestra web sin pasar por Varnish y viéramos el código que nos devuelve, veríamos las etiquetas <esi>, mientras que si pasamos por Varnish, lo que se mostrara sera el contenido de los ficheros.

Creo que este lenguaje bien usado tiene mucha potencia y voy a seguir investigándolo. Si alguien tiene interés en esta tecnología puede ponerse en contacto conmigo a través de los comentarios de este blog, para así poder hacer pruebas conjuntas.

Un pensamiento en “Configurar Varnish 3 para uso con ESI

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *