Entendiendo Varnish Cache

Tienes un proyecto, empieza a funcionar, a ganar visitas, mola ¿verdad? pero casi al mismo tiempo el rendimiento empieza a flojear. Las páginas cargan cada vez más despacio ¿Qué hacemos?

Que no cunda el pánico, hay muchas tareas que podemos hacer para mejorar el performance: optimizar partes del código backend, optimizar las llamadas a los assets, minimizar los assets, optimizar queries a la base de datos, cachear las queries con memcached o similar, incluso poner un acelerador HTTP que cachee las peticiones. De eso vamos a hablar hoy, de Varnish.

25791162001_e8cc65245f_z

Varnish es un software que permite contrarrestar la perdida de velocidad de una aplicación web. Para ello Vanish Cache trabaja como proxy inverso, situándose delante del servidor HTTP, cacheando la respuesta de dicho servidor web en memoria. La próxima vez que un usuario visite la misma URL, será Varnish quien la sirva, con ello conseguimos una gran aceleración de las respuestas de nuestra aplicación web.

Cuando Varnish recibe una petición HTTP, puede realizar diferentes acciones:

  • Permitir la petición y servirla si la tiene en memoria
  • Denegar esa petición dependiendo de algunos parámetros
  • Hacer que la solicitud llegue al servidor web para que sea este quien la atienda
  • Cachear la respuesta del servidor web o no cachearla dependiendo de una serie de criterios.

Para hacer esto posible Varnish posee un lenguaje de configuración llamado VCL (Varnish configuration Language) con el que podemos programar que hacer con las peticiones HTTP.

Instalando Varnish

Para instalar Varnihs en Ubuntu o Debian, solo tenemos que ejecutar: sudo apt-get install varnish para verificar que todo ha ido bien: varnishd -V

Si todo ha ido bien, tendremos Varnish instalado en /etc/varnish/ ahora solo tenemos que configurarlo para que pasen por el todas las peticiones http que llegan a nuestro servidor.

Configurando Apache

La configuración por defecto hace que tengamos que cambiar un par de cosillas. Seguramente ahora mismo sea Apache quien está atendiendo todas las peticiones que llegan por el puerto 80. Como ahora queremos que sea Varnish el que atienda las peticiones HTTP primero lo que tenemos que hacer es modificar la configuración de Apache para indicarselo.

En primer lugar chequeamos que Apache esté funcionando en el puerto 80, para ello hacemos un curl que tiene que devolvernos un 200

$ curl -I  http://localhost
HTTP/1.1 200 OK

Abrimos el archivo de configuración de Apache /etc/apache2/httpd.conf y en la linea 41 cambiamos el puerto de escucha por el 8080

# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 8080

Reiniciados Apache (apachectl restart) y comprobamos que el cambio es correcto.

$ curl -I  http://localhost:8080
HTTP/1.1 200 OK

Configurando Varnish

Configuramos un demonio para indicar la memoria que queremos usar para Varnish. Para ello editamos /etc/default/varnish

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

Vamos a explicar un poco los parámetros, tenemos muchas mas opciones de configuración que podemos encontrar en el libro de Varnish y sobre todo en la ayuda (man):

  • parámetro -a:  Le indicamos a Varnish por qué IP y/o puerto debe escuchar.
  • parámetro -T: Indica por que dirección y puerto podemos acceder a la administración de Varnish.
  • parámetro -f: Indica donde está el archivo de configuración inicial de Varnish
  • parámetro -S: Indica la ruta del secreto de Varnish, lo utilizamos para la autenticación con la consola de varnish
  • parámetro -s: Indicamos donde queremos que se almacene la caché y cual será su tamaño.

Ahora toda la configuración que hagamos será en los ficheros VCL de Varnish. Una de las primeras cosas será indicar cual es el servidor de Backend. Como comentamos antes, nuestro servidor de Backend es un ache por en el puerto 8080. Así que editamos el archivo /etc/varnish/default.vcl

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

Y reiniciar Varnish:

$ varnishadm vcl.load vcl01 /etc/varnish/default.vcl $ varnishadm vcl.use vcl01

Listo, ya tenemos nuestro Varnish funcionando con una configuración básica. Ahora solo nos queda seguir aprendiendo sobre como sacarle el máximo partido a Varnish editando el tiempo de caché, que urls se cachean y cuales no. El ciclo de vida de las peticiones HTTP.

Recursos

Para ello lo mejor es seguir el libro de Varnish: http://book.varnish-software.com/4.0/ Aquí os dejo una lista de recursos sobre Varnish: https://github.com/huayra/awesome-varnish Y una de las kill feature de Varnish son sus modulos, ya que con ellos podemos personalizar mucho más el ciclo de vida de las peticiones: https://www.varnish-cache.org/vmods/ para hacer cosas increíbles.

Anuncios

Un comentario sobre “Entendiendo Varnish Cache

Comenta la entrada

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s