Varnish Cache Guide
Varnish Cache Guide
Ken Venturi
Índice
1. Algunos datos sobre Irontec
2. ¿Qué es Varnish Cache?
3. Escenarios Típicos para el Despliegue de Varnish Cache
4. Versiones de Varnish Cache
5. Instalación de Varnish Cache
6. Conceptos Teóricos Precios
7. Introducción a la Gestión Interna de Varnish Cache y sus Flujos
8. Obtención de Estadísticas
9. Configuración de Varnish Cache
10. Monitorización de Varnish Cache
11. Configuraciones Específicas para WordPress
12. Conclusiones
algunos datos sobre Irontec
• Versión “OS”
– Es software libre, ¿acaso podría ser mejor?
– ¿Hemos comentado ya que es software libre?
– Lo dicho, OpenSource.
• Version “Subscription” (http://www.varnish-software.com)
– Incluye soporte de Varnish Software
– Incluye productos propietarios
– Añade soluciones que proporcionan valor añadido a Varnish
Cache
Versiones de Varnish Cache
5. Instalación de Varnish Cache
Instalación de Varnish Cache
Usando el gestor de paquetes (Debian)
• # apt-get update
• # apt-get install varnish
• # wget http://repo.varnish-cache.org/source/varnish-3.0.5.tar.gz
• # apt-get install build-essential automake libtool
pkg-config libpcre3-dev libncurses-dev xsltproc
groff-base libedit-dev1
• # cd varnish-cache
• # sh autogen.sh
• # sh configure
• # make
• # make check Es normal que al ejecutar “make check”
de uno o dos errores.
• # make install
Instalación de Varnish Cache
Compilando el Código Fuente (Debian)
• host
– Host que se usará como servidor de backend. Puede ser una IP o un hostname que
resuelva sobre una única IP.
• port
– El puerto del servidor de backend al que se conectará Varnish. El puerto por defecto para el
servicio HTTP es el 80.
• host_header
– Cabecera para añadir al host.
• connect_timeout
– El timeout para las conexiones.
• first_byte_timeout
– El timeout para el primer byte.
• between_bytes_timeout
– El timeout entre bytes.
• probe
– Pruebas de salud del host. Se detalla más adelante.
• max_connections
– Número máximo de conexiones que pueden abrirse contra el backend.
Conceptos Teóricos Previos
Servidor de Backend
https://www.varnish-cache.org/docs/trunk/reference/vcl.html
• Operadores
• Condicionales
• Tipos de datos
• Expresiones regulares
• Includes
• Imports
• ...
Conceptos Teóricos Previos
• vcl_recv
• vcl_pipe
vcl_recv y vcl_fetch permiten el 99%
• vcl_pass de las configuraciones que puedan
Requerirse.
• vcl_hash
• vcl_hit
• vcl_miss
• vcl_fetch Todas estas subrutinas se explican más
adelante en detalle.
• vcl_deliver
• vcl_error
Conceptos Teóricos Previos
• pass
– Hace que la solicitud y las consecuentas respuestas pasen hacia y
desde el servidor directamente sin ser cacheadas.
• lookup
– Indica a Varnish que entregue contenido de la caché.
• pipe
– Cortocircuita la conexión entre el cliente y el servidor de backend, de
manera que Varnish sólo mueve bytes entre uno y otro extremo hasta
que la conexión se cierra.
• deliver
– Remite el objeto cacheado al cliente.
• esi
– Lleva a cabo el procesamiento ESI sobre el documento recuperado.
Conceptos Teóricos Previos
• req
– Proviene del cliente.
– Cuando Varnish recibe una petición este objeto es creado y poblado.
– La mayor parte del trabajo en vcl_recv se hace sobre este objeto.
• beresp
– Respuesta que proviene del servidor de backend.
– Contiene las cabeceras y el objeto proveniente del servidor de
backend.
– La mayor parte del trabajo en vcl_fetch se hace sobre este objeto.
• obj
– El objeto cacheado.
– Es un objeto parcialmente de sólo lectura (excepto obj.ttl) que reside
en memoria.
Conceptos Teóricos Previos
Directors
• Random Director
– Usa un número generado aleatoriamente para
determinar el backend.
– Opciones Director:
● .retries: Opcional. Veces que intentará el
• Client Director
– Escoge un backend basado en la “identity” del
cliente. Se puede establecer la variable VCL
client.identity para identificar al cliente.
– Opciones Director:
● .retries: Opcional. Veces que intentará el
• Hash Director
– Escoge un backend en base al valor hash de la
URL. Útil para realizar balanceo de carga. Usa
el valor de req.hash.
– Opciones Director:
● .retries: Opcional. Veces que intentará el
• Ejemplo:
• Ejemplo:
Conceptos Teóricos Previos
Health Checks – Backend Probes
• .url
– URL que Varnish solicitará para probar el backend. Por defecto
es “/”.
• .request
– Tiene precedencia sobre .url. Especifica una petición HTTP
usando varias cadenas de caracteres. Se inserta \r\n
automáticamente después de cada cadena de caracteres.
• .window
– Ventana con los últimos X resultados. Se sobrescriben los más
antiguos conforme se realizan nuevas pruebas. Por defecto es 8.
• .threshold
– Determina el número de entradas de .window que deben ser
positivas para que el backend sea declarado saludable. Por
defecto es 3.
Conceptos Teóricos Previos
Health Checks – Backend Probes
• .initial
– Determina el número de entradas de .window que se
consideran positivas cuando Varnish se inicia. Por defecto
toma el valor de .threshold.
• .expected_response
– Respuesta que se espera recibir del backend. Por defecto
200.
• .interval
– Con qué frecuencia se realizan las pruebas. Por defecto
cada 5 segundos.
• .timeout
– Velocidad con que una prueba da un timeout. Por defecto
2 segundos.
Conceptos Teóricos Previos
Health Checks – Backend Probes
• Ejemplos:
Conceptos Teóricos Previos
ACLs
• recv (vcl_recv)
– Se invoca al comienzo de una petición, después de que la petición
haya sido recibida y parseada.
– Decide si se sirve o no a la petición, cómo se sirve y, dado el caso,
desde qué backend.
– Termina con una llamada a return() con alguna de las siguientes
palabras clave:
● error code [reason]
– Devuelve un código de error al cliente y abandona la petición.
● pass
– Cambia a modo pass. Transmitiá el control a vcl_pass.
● pipe
– Cambia a modo pipe. Transmitirá el control a vcl_pipe.
● lookout
– Busca el objeto en la caché. Transmitirá el control a vcl_hit o
vcl_miss dependiendo de si el objeto esa en la caché o no.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Máquina de Estados - Modos
• pipe (vcl_pipe)
– Se invoca al entrar en modo pipe.
– En este modo la solicitud es remitida al servidor de backend y
cualquier dato intercambiado entre el cliente y el backend es
transmitido sin alterarse hasta que se cierra la conexión.
– Termina con una llamada a return() con alguna de las siguientes
palabras clave:
● error code [reason]
– Devuelve un código de error al cliente y abandona la
petición.
● pipe
– Procede con el modo pipe.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Máquina de Estados - Modos
• pass (vcl_pass)
– Se invoca al entrar en modo pass.
– En este modo la petición se pasa al backend y la respuesta del
backend se manda al cliente sin entrar en la caché
– Termina con una llamada a return() con alguna de las siguientes
palabras clave:
● error code [reason]
– Devuelve un código de error al cliente y abandona la
petición.
● pass
– Procede con el modo pass.
● restart
– Reinicia la transacción e incrementa el contador de
reinicios. Si dicho contador supera max_restarts Varnish
arroja un error de “guru meditation”.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Máquina de Estados - Modos
• hash (vcl_hash)
– Debe invocarse hash_data() sobre los datos que quieren
incorporarse al hash.
– Termina con una llamada a return() con alguna de las siguientes
palabras clave:
● hash
– Procede.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Máquina de Estados - Modos
• hit (vcl_hit)
– Se invoca después de una búsqueda (lookup) si el documento
solicitado se encuentra en la caché.
– Termina con una llamada a return() con alguna de las siguientes
palabras clave:
● error code [reason]
– Devuelve un código de error al cliente y abandona la petición.
● pass
– Cambia a modo pass. Transmitiá el control a vcl_pass.
● restart
– Reinicia la transacción e incrementa el contador de reinicios.
Si dicho contador supera max_restarts Varnish arroja un error
de “guru meditation”.
● deliver
– Entrega el objeto en caché al cliente. Transmitirá el control a
vcl_deliver.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Máquina de Estados - Modos
• miss (vcl_miss)
– Se invoca después de una búsqueda (lookup) si el documento
solicitado no se encuentra en la caché.
– Su funcionalidad consiste en decidir si se intenta recuperar o no
el documento desde el backend y desde qué backend.
– Termina con una llamada a return() con alguna de las siguientes
palabras clave:
● error code [reason]
– Devuelve un código de error al cliente y abandona la
petición.
● pass
– Cambia a modo pass. Transmitiá el control a vcl_pass.
● fetch
– Recupera el objeto solicitado del backend. Transmitirá el
contorl a vcl_fetch.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Máquina de Estados - Modos
• fetch (vcl_fetch)
– Se invoca después de que un documento haya sido satisfactoriamente
recuperado del backend.
– Termina con una llamada a return() con alguna de las siguientes palabras
clave:
● error code [reason]
– Devuelve un código de error al cliente y abandona la petición.
● esi
– Realiza un procesamiento ESI sobre el documento que ha sido
recuperado del backend.
● pass
– Cambia a modo pass. Transmitiá el control a vcl_pass.
● restart
– Reinicia la transacción e incrementa el contador de reinicios. Si dicho
contador supera max_restarts Varnish arroja un error de “guru
meditation”.
● deliver
– Incorpora el objeto a la caché y lo entrega al cliente. Transmitirá el
control a vcl_deliver.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Máquina de Estados - Modos
• deliver (vcl_deliver)
– Se invoca antes de que un documento sea entregado al cliente.
– Termina con una llamada a return() con alguna de las siguientes
palabras clave:
● error code [reason]
– Devuelve un código de error al cliente y abandona la
petición.
● restart
– Reinicia la transacción e incrementa el contador de
reinicios. Si dicho contador supera max_restarts Varnish
arroja un error de “guru meditation”.
● deliver
– Entrega el objeto al cliente.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Máquina de Estados - Modos
• error (vcl_error)
– Se invoca cuando se encuentra un error, tanto implícita como
exlícitamente, sea por errores internos o del backend.
– Termina con una llamada a return() con alguna de las siguientes
palabras clave:
● restart
– Reinicia la transacción e incrementa el contador de
reinicios. Si dicho contador supera max_restarts Varnish
arroja un error de “guru meditation”.
● deliver
– Entrega el objeto al cliente.
Introducción a la Gestión Interna de Varnish Cache y sus Flujos
Flujos
8. Obtención de Estadísticas
Obtención de Estadísticas
• varnishlog
– Lee y muestra por consola los logs que el servicio de Varnish
está generando en memoria.
– Opciones más comunes:
● -b: Muestra sólo registros del tráfico transmitido entre Varnish
y el backend.
● -c: Muestra sólo los registros del tráfico transmitido entre
Varnish y el cliente.
● -m tag:regex: Muestra sólo las transacciones donde la
etiqueta concuerda con una expresión regular.
– https://www.varnish-cache.org/docs/3.0/reference/varnishlog.html
Obtención de Estadísticas
• varnishlog
Obtención de Estadísticas
• varnishhist
– Lee los registros que Varnish está generando y muestra un
histograma que se actualiza continuamente mostrando la
distribución de las últimas N peticiones.
– Opciones más comunes:
● -b: Muestra sólo registros del tráfico transmitido entre Varnish
y el backend.
● -c: Muestra sólo los registros del tráfico transmitido entre
Varnish y el cliente.
● -d: Procesa entradas de registro viejas cuando se inicia. Por
defecto toma los datos que se generan a partir del inicio de
su ejecución.
● -m tag:regex: Muestra sólo las transacciones donde la
etiqueta concuerda con una expresión regular.
– https://www.varnish-cache.org/docs/3.0/reference/varnishhist.html
Obtención de Estadísticas
• varnishhist
Obtención de Estadísticas
• varnishtop
– Lee los registros que Varnish está generando y muestra una lista
actualizada con las entradas de registro más frecuentes.
– Opciones más comunes:
● -1: No actualiza la lista, muestra las estadísticas una vez y
sale (implica -d).
● -b, -c, -d: Estas opciones realizan la misma función que con
el comando anterior (varnishhist).
– https://www.varnish-cache.org/docs/3.0/reference/varnishtop.html
Obtención de Estadísticas
• varnishtop
Obtención de Estadísticas
• varnishsizes
– Lee los registros que Varnish está generando y muestra un
histograma que se actualiza continuamente mostrando la
distribución de las últimas N peticiones en una escala logarítmica
que representa los bytes.
– Opciones más comunes:
● -b, -c, -d: Estas opciones realizan la misma función que en
comandos anteriores (varnishhist).
– https://www.varnish-cache.org/docs/3.0/reference/varnishsizes.html
Obtención de Estadísticas
• varnishsizes
Obtención de Estadísticas
• varnishstat
– Muestra estadísticas de la instancia de Varnish que está en
ejecución.
– Opciones más comunes:
● -1: No actualiza la lista, muestra las estadísticas una vez por
la salida estándar y finaliza.
● -x: Muestra los resultados en formato XML (-j para hacerlo en
formato JSON).
– https://www.varnish-cache.org/docs/3.0/reference/varnishstat.html
Obtención de Estadísticas
• varnishstat
Obtención de Estadísticas
• varnishncsa
– Lee los registros generados por Varnish en memoria en el
formato de registro “combined” Apache/NCSA.
– Opciones más comunes:
● -a: En caso de escribirse a un fichero anexa la información,
no la sobrescribe.
● -d: Procesa entradas de registro viejas cuando se inicia. Por
defecto toma los datos que se generan a partir del inicio de
su ejecución.
● -f: Hace que prevalezca la cabecera HTTP X-Forwarded-For
frente a client.ip en el registro.
● -D: Ejecuta el comando como un demonio.
● -F format: Especifica el formato usado para el registro.
– https://www.varnish-cache.org/docs/3.0/reference/varnishncsa.html
9. Configuración de Varnish Cache
En esta sección...
• # pkill varnishd
• # varnishd -f /etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:8080
● Ejemplos:
Configuración de Varnish Cache
Lograr un Ratio Elevado de Hits
https://addons.mozilla.org/es/firefox/addon/live-http-headers/
Configuración de Varnish Cache
Lograr un Ratio Elevado de Hits
– Age
– Pragma
– Authorization
Configuración de Varnish Cache
Lograr un Ratio Elevado de Hits
MUY CONSERVATIVO
Configuración de Varnish Cache
Cookies
• Del cliente:
cliente
Configuración de Varnish Cache
Cookies
http://www.akamai.com/html/support/esi.html
Configuración de Varnish Cache
ESI (Edge Side Includes)
• Ejemplo:
• Ejemplo:
Configuración de Varnish Cache
Detección de Dispositivo
https://github.com/varnish/varnish-devicedetect/
Configuración de Varnish Cache
Detección de Dispositivo
• Ejemplo:
Establecemos la cabecera.
• Ejemplo:
Varnish añade la cabecera
HTTP X-UA-Device a la solicitud
al servidor de backend, el
cual indica en la cabecera Vary
de la respuesta que el contenido
es dependiente de dicha
cabecera.
Configuración de Varnish Cache
Websockets
http://www.websocket.org/ - http://dev.w3.org/html5/websockets/
Configuración de Varnish Cache
VMOD (Extensiones y Módulos de Varnish)
https://www.varnish-cache.org/vmods
Configuración de Varnish Cache
CLAVES
http://wordpress.org/plugins/wordpress-varnish-as-a-service
Configuraciones Específicas para WordPress
WP Super Cache
http://wordpress.org/plugins/wp-super-cache/
Configuraciones Específicas para WordPress
Plantillas de Configuración de Varnish
https://github.com/mattiasgeniar/varnish-3.0-configuration-templates
Configuraciones Específicas para WordPress
Problema con la Cabecera X-Forwarded-For
https://www.varnish-cache.org/trac/ticket/203
12. Conclusiones
Conclusiones