Cómo configurar un servidor de caché Varnish

how-to-setup-a-varnish-cache-server

Los sitios web con mucho tráfico necesitan servir el mismo contenido varias veces a diferentes usuarios. Dependiendo de su aplicación, puede ser realmente costoso (hablando de recursos) procesar toda la lógica de la aplicación cada vez que un usuario solicita una página web. Aquí es donde viene el almacenamiento en caché del servidor, puede guardar una copia temporal del contenido en la memoria y servir este contenido a todos los usuarios.

Varnish es excelente para almacenar en caché el contenido del lado del servidor. Esencialmente, debe almacenar en caché el contenido HTML, pero también puede almacenar en caché los archivos: CSS, JS, imágenes, documentos.

Suena bien, pero la verdad es que, por defecto, Varnish no hace nada, o al menos podría estar desperdiciando las ventajas de este software, y la documentación no ayuda, así que he escrito este artículo, para que pueda obtener el mayor beneficio de Varnish. Voy a explicar dónde y cómo configurar, probar e implementar un servidor de caché Varnish para su aplicación.

Para fines de demostración, supongamos que tenemos 2 instancias de servidor para nuestros servidores de aplicaciones y caché con las siguientes direcciones IP locales:

  • App Server: 192.168.1.2
  • Cache Server: 192.168.1.3

Instalar Servidor de Caché Varnish

Para este artículo, vamos a instalar un servidor Ubuntu 16.04 con Varnish 4.0. Para instalar Varnish, solo necesita ejecutar:

sudo apt install varnish

Instalaré Varnish 4.0, y de ahora en adelante estarás prestando especial atención a 2 archivos específicos:

/etc/default/varnish /etc/varnish/default.vcl

Configuración Backend

Lo primero que debe hacer es configurar el backend o indicarle a Varnish dónde vivirá la aplicación web:

  • ¿Cuál es el hostname o la dirección IP?
  • ¿Cuál es el puerto?

Para definirlo, debe ir y actualizar el archivo /etc/varnish/default.vcly encontrar la siguiente sección, que se configurará para nuestro propósito de ejemplo de esta manera:

backend default {
  .host = "192.168.1.2";
  .port = "8080";
  .first_byte_timeout = 60s;
  .connect_timeout = 300s;
}

Le indicará a Varnish que escuche la aplicación que se ejecuta en IP 192.168.1.2 y puerto 8080.

Configure el Varnish daemon

Lo primero que necesita definir, es dónde se ejecutará Varnish. Lo dejaremos ejecutándose en el puerto predeterminado 6081. Es muy común ejecutar este daemon en el puerto 80 y 443 para SSL, pero preferimos poner NGINX al frente y dejarlo para atender el tráfico.

Con respecto a la memoria, una instalación en blanco de Varnish se ejecutará con 256 MB de memoria, que podría ser suficiente para algunas aplicaciones, pero para aplicaciones de alto tráfico, podría no ser suficiente, y más si ha reservado un servidor dedicado solo para caché.

Puede cambiar eso en:

/etc/default/varnish

Encuentre la siguiente sección:

DAEMON_OPTS="-a :6081 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"

Para actualizar la cantidad de RAM, cambie la última línea donde dice 256m y actualice para el valor requerido, en mi caso, quiero dedicar 3GB de RAM a Varnish, para que el bloque se vea así:

DAEMON_OPTS="-a :6081 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,3G"

Valide que se ejecute con la configuración correcta

Confirme que se está ejecutando como se esperaba, verifique el proceso ps aux | grep varnish y debe ver algo como esto:

/usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T :6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,3G

Corregir el Varnish daemon de inicio en algunas instalaciones de Ubuntu

Hemos detectado un error en el que el servicio no sigue las instrucciones definidas en el archivo de Varnish y es posible que deba editar el servicio de inicio.

Para hacerlo, abra y edite el archivo

/lib/systemd/system/varnish.service

y verá algo como esto:

[Unit]
Description=Varnish HTTP accelerator
Documentation=https://www.varnish-cache.org/docs/4.1/ man:varnishd

[Service]
Type=simple
LimitNOFILE=131072
LimitMEMLOCK=infinity
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T :6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256M
ExecReload=/usr/share/varnish/reload-vcl
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
PrivateDevices=true

[Install]
WantedBy=multi-user.target

Para que funcione, deberá actualizar la sección dentro de la línea ExecStart y reemplazarla por la configuración requerida:

ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T :6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,3G

Una vez que hayas terminado con eso, debes volver a cargar el servicio daemon: systemctl daemon-reload y luego reiniciar Varnish.

Cómo configurar a PURGE Cache

Hay 2 formas de borrar el caché de Varnish:

  • Reiniciar el servicio Varnish.
  • Enviar un PURGE request al servidor Varnish.

Reiniciar Varnish solo se trata de reiniciar el servicio:

sudo service varnish restart

Pero lo que realmente necesitamos es poder enviar una solicitud PURGE desde el servidor de aplicaciones. Se puede lograr indicando al servidor que purgue una RUTA específica o todas ellas. Al usar CURL, la solicitud se vería así:

curl -X PURGE https://192.168.1.3:6181

De forma predeterminada, Varnish no permitirá una solicitud PURGE de un servidor externo, por lo que debe permitir las solicitudes del servidor de aplicaciones. Para hacerlo, ve y edita /etc/varnish/default.vcly encontrar la sección purge donde necesita agregar la dirección IP del servidor de aplicaciones:

acl purge {
  "localhost";
  "127.0.0.1";
  "192.168.1.2"/24;
}

Cómo depurar el PURGE

Deberá validar que todo funciona correctamente. Para hacerlo, puede usar el siguiente comando:

varnishlog -g request -q 'ReqMethod eq "PURGE"'

Luego puede enviar una solicitud PURGE y debería ver algo como esto para confirmar que se recibió la solicitud PURGE:

* << Request >> 1179851
- Begin req 1179850 rxreq
- ReqStart 192.168.195.197 39700
- ReqMethod PURGE
- ReqURL /.*

- ReqProtocol HTTP/1.1
- ReqHeader Host: swapps.com
- ReqHeader User-Agent: W3 Total Cache
- ReqHeader Connection: close
- ReqHeader X-Forwarded-For: 192.168.195.197
- VCL_call RECV
- Timestamp Process: 1531199642.768541 0.000094 0.000094
- RespHeader Date: Tue, 10 Jul 2018 05:14:02 GMT
- RespHeader Server: Varnish
- RespHeader X-Varnish: 1179851
- RespProtocol HTTP/1.1
- RespStatus 200
- RespReason OK
- RespReason Purged
- End

Un estado 200 OK significa que todo salió bien y Varnish ha borrado el caché para la URL solicitada, y debe tener todo lo que necesita para comenzar a almacenar en caché el contenido en su servidor.

El siguiente paso si no lo ha hecho es configurar las reglas de qué contenido desea almacenar en caché y cuál no, pero ese es el tema para otra publicación de blog y dependerá en gran medida del tipo de aplicación, marco o CMS utilizado.