En un artículo anterior ya hicimos una introducción previa a varnish por lo que si quieres saber mejor cómo puede ayudarte te aconsejo que lo leas por encima.
En este artículo os voy a explicar los puntos mínimos que hemos de cubrir para tener una configuración mínima de varnish funcionando. Al acabar el tutorial tendrás una instalación mínima que funciona, que cachea en parte tu aplicación web y que será la base para construir sistemas mucho más complejos que se adapten a tus necesidades.
Consideraciones previas
El tema de los puertos
Como bien sabrás los servidores web funcionan habitualmente escuchando el puerto 80 para http y el 443 para https (En este artículo dejaremos de lado https ya que debido a que el tráfico está encriptado hay que tener algunas consideraciones adicionales).
Varnish es un acelerador web que se coloca delante del servidor web, entre este y el usuario. Es decir, las peticiones que antes se dirigían hacia el web server, ahora las atenderá varnish, y varnish se encargará de hablar con el servidor web.
Por tanto, varnish y apache (o nginx) no pueden estar escuchando en el mismo puerto.
Existen varias soluciones a este problema. Podríamos instalar varnish en otro servidor, siendo esta una de las soluciones habituales en entornos de alta demanda.
También podemos mover el puerto en el que apache atiende a otro diferente, por ejemplo el 8000. Entonces, dejaremos que varnish sirva sobre el 80 y realice las peticiones sobre el 8000, donde el servidor web le atenderá.
Varnish en el mismo servidor donde ya corren varias webs
En mi caso, me encontré con que tenía varias webs en el servidor, todas ellas corriendo con apache y, por supuesto, en el puerto 80. Yo quería instalar varnish en el mismo servidor, por lo que debía hacer varios cambios en las configuraciones que me iban a dejar las webs caídas por algo de tiempo.
Yo aproveché para hacer un cambio de servidor completo, gracias a las ventajas de los servidores virtuales. Creé una nueva instancia, instalé un sistema limpio y actualizado, configuré apache para correr en el puerto 8000 y varnish en el 80 moví sólo una web. Una vez estuvo todo correcto, empecé a mover webs del server antiguo al nuevo. Cuando finalicé la migración de todas las webs apagué el server antiguo. Sólo pagué por dos servidores durante los días que los tuve en marcha pero el proceso me sirvió para limpiar bien la casa.
Otra alternativa si no quieres, o no puedes levantar otra máquina virtual es instalar varnish en el puerto 8000 en lugar del 80. A partir de aquí, sólo tu sabes que corre en el 8000 (también puedes filtrar el tráfico por IP para que nadie haga el cotilla). Así puedes ir probando todas tus webs con varnish, accediendo a ellas a través del nuevo puerto. Cuando estés seguro de que todo funciona, configuras apache para servir en el 8000 y varnish en el 80, es decir, le das la vuelta a la instalación. Es bastante sencillo y seguro.
Memoria y CPU
Varnish es básicamente un consumidor de memoria y CPU. En realidad, básicamente de memoria, porque la CPU que usa la está ahorrando a otros servicios como el servidor web o la base de datos.
En mi experiencia, con 500 MB o 1 GB es suficiente para que varnish suponga una mejora MUY importante en rendimiento del server. Pero estos números dependen de cada uno, tipo de web, comportamiento de las visitas, si usamos un CDN para estáticos o bien si los guardaremos en varnish, etc…
Si instalas varnish en tu servidor actual, tienes que asegurarte de que dispones de esa memoria adicional. Ten en cuenta también que cuando varnish esté correctamente configurado, tu apache correrá mas ligero por lo que necesitará menos recursos que pueden asignarse a varnish.
Si lo estás instalando en un servidor nuevo que hará de frontal, mi consejo es que empieces con una configuración mínima de 2GB o 4 GB que siempre puedes ampliar en el futuro, especialmente si corres con virtual servers. ¿Todavía con máquinas físicas? Tendrás que llamar a tu proveedor para le meta RAM, pero.. ¿De verdad estás usando aún máquinas físicas?
Instalando varnish
Ya he hablado antes de que existen diferentes configuraciones posibles. Aquí vamos a explicar como instalar varnish en un servidor nuevo, donde un apache escucha en el puerto 8000 y varnish correrá delante de el en el puerto 80.
Dependiendo de tu sistema operativo tendrás que descargar el paquete del repositorio adecuado. En mi caso, usé un debian y la instalación fue mi sencilla, simplemente un
sudo apt-get install varnish
El archivo de configuración de varnish es /etc/default/varnish. Allí configuré varnish para usar el puerto 80 y una memoria de 1024 MB. Esta es la parte que te interesa:
DAEMON_OPTS=»-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,1024m»
Un restart de apache y varnish, y todo está corriendo ya bajo varnish.
sudo service apache2 restart
sudo service varnish restart
NOTA: El orden es importante. A partir de ahora, siempre que quieras reiniciar tu servidor web debes reiniciar primero apache y luego varnish. Si lo haces al revés, varnish podría no reflejar parte de los cambios que hayan necesitado reiniciar tu apache.
Y ya lo tienes, si visitas tu web debería funcionar. El navegador ha pedido la página al puerto 80, allí varnish ha atendido la petición, ha visto que no tenía la página en memoria y la ha solicitado al apache. Cuando ha obtenido la respuesta, la ha entregado a tu navegador.
Puedes usar firebug u otro plugin que estudies las cabeceras de respuesta de la petición. Verás que la respuesta incluye algunos campos como Age=0, Via=1.1 varnish-v4 y X-varnish.
Varnish instalado, pero, ¿Está funcionando?
Técnicamente si. Está funcionado. Si el ejemplo que has usado es una página estática con algunos recursos pesados como imágenes notarás claramente como se sirve más rápido. Puedes verlo fácilmente con firebug, evaluando los tiempos de respuesta. Puedes comparar pidiendo la misma página al puerto 80 y al 8000 y mirando los tiempos.
También puedes fijarte en la cabecera http llamada age. Si tiene un valor diferente a cero y se incrementa en cada petición, significa que se está sirviendo desde la cache.
También puedes abrir tu log de apache y realizar múltiples peticiones. Verás como sólo aparece la primera. El resto, se entregan desde varnish y apache ni se entera.
También puedes usar la herramienta de consola varnishstat para ver que es lo que está pasando en varnish. main.cache_hit es un indicador que deberíamos mirar. Expresa el número de peticiones que se han servido desde la cache de varnish.
Mi varnish no cachea
Puede ocurrir, y en la realidad es muy frecuente, que después de una instalación básica de varnish no notemos ninguna mejora. Esto puede deberse a diferentes motivos que iremos exponiendo más adelante.
Uno de ellos puede ser la configuración de tiempos de expiración de tu apache. Si apache está sirviendo las páginas indicando que no se cacheen, o sin tiempos de expiración, varnish obedecerá a esas directivas y no cacheará salvo que se lo digamos explicitamente.
Otro motivo son las cookies. Como sirven para guardar estados dentro de una sesión concreta, varnish es muy conservador y por defecto decide ignorar cualquier petición que tenga cookies, para evitar riesgos y servir una página de un usuario a otro. ¡Imagina que ocurriría si consulto mi saldo bancario y me enseñan los datos de otro cliente!
En el siguiente artículo os explicaré como solucionar el tema de las cookies y os mostraré lo que debería ser un archivo básico de configuración que ofrece un buen rendimiento.