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.
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.
Un comentario en “Entendiendo Varnish Cache”