Varnish cache Colocar un sticky en la sesion del usuario para que sea despachado por el mismo servidor ?
Un problema que tenemos con varnish cache y el balanceo de carga es que se asigna un servidor diferente a cada peticion, esto es un problema si queremos conservar los datos de nuestro cliente en un servidor por ejemplo un e-commerce. Para solucionar este problema podemos asignar un sticky al cliente el cual no cambia y el cual le dice a varnish que servidor le debe asignar. Con este codigo podemos lograr dicho cometido:
/etc/varnish/default.vcl
vcl 4.0;
import directors;
import std;
import cookie;
import header;
//Declaramos los servidores y sus caracteristicas
backend www1 {
.host = "10.132.54.66";
.port = "80";
}
backend www2 {
.host = "10.132.13.11";
.port = "80";
}
//Inicializamos varnish
sub vcl_init {
//Declaramos el director de tipo hash para que reciba datoas aleatorios y en base a esos datos seleccione un servidor
new hash_director = directors.hash();
hash_director.add_backend(www1, 1);
hash_director.add_backend(www2, 1);
}
//esta funcion es para decirle a varnish que datos se mandan y a que servidor
sub vcl_recv {
//Si la la url es de imagenes o de admin redireccionamos ese trafico al servidor 1
if (req.http.host ~ "images.demotodocuba.com" || req.url ~ "wp-(login|admin)" ) {
set req.backend_hint = www1;
}
else {
//Leemos las cookies
cookie.parse(req.http.cookie);
//Si la cookie ya esta en el navegador (osea la segunda refresacada) asignamos esa cookie a nuestra variable sticky
if(cookie.get("sticky")) {
set req.http.sticky = cookie.get("sticky");
}
//Si no esta la variable en nuestro navegador generamos un nuevo sticky aleatorio
else {
set req.http.sticky = std.random(1, 100);
}
//El sticky generado anteriormente se lo pasamos al director ya el director se encargara de asignar un servidor siempre que paemos el mismo sticky
set req.backend_hint = hash_director.backend(req.http.sticky);
}
}
//Esta funcion se usa para modificar lo que sale de varnish
sub vcl_deliver {
//Si hay un sticky ya generado este se escribe en la cabecera con una expiracion de 60 min
if(req.http.sticky){
header.append(resp.http.Set-Cookie,"sticky=" + req.http.sticky + "; Expires=" + cookie.format_rfc1123(now, 60m));
}
}
//include "custom.vcl"; //Otros parametros
Ave que vuela, a la cazuela.