Varnish cache Colocar un sticky en la sesion del usuario para que sea despachado por el mismo servidor ?

Resultado de imagen para images sticky

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

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

En Programador Novato vivimos de los anuncios, hemos detectado que está utilizando extensiones para bloquear anuncios. Ayudanos deshabilitando tu bloqueador de anuncios. :)