Varnish come load balancer e sessioni “sticky”.

Versione originale di questo blog post (in inglese): https://www.varnish-software.com/blog/proper-sticky-session-load-balancing-varnish – scritto da Per Buer.

Assumiamo che state usando varnish come load balancer e che la vostra web application abbia necessità di mantenere determinati “dati”(ad es. un cookie_hdr)finchè la sessione è attiva. Ora, per evitare che uno user acceda a dati destinati ad un altro user, bisogna che Varnish sappia cosa sta succedendo e che una determinata sessione è relativa ad un determinato user. In pratica vogliamo che un visitatore che torna abbia tutte le volte lo stesso application server.

La soluzione è facile: basta generare una random string prima che al client(aka user che ha fatto la richiesta) venga assegnato un backend. Dopodichè bisogna rendere “persistente” la stringa generate, usando un cookie, e assicurarsi che venga ri-letta da uno user che “ritorna” sulla pagina.

Ecco il VCL d’esempio:

vcl 4.0;
import std;
import directors;
import cookie;
import header;

backend s1 {
        .host = "127.0.0.1";
        .port = "8080";
}
backend s2 {
        .host = "127.0.0.1";
        .port = "9090";

}

sub vcl_init {
    new cdir = directors.hash();
    cdir.add_backend(s1,1);
    cdir.add_backend(s2,1);
}

sub vcl_recv {
    cookie.parse(req.http.cookie);
    if (cookie.get("sticky")) {
        set req.http.sticky = cookie.get("sticky");
    } else {
        # The cookies will have floats in them. 
        # Whatever, ehh, floats your boat can be used.
        set req.http.sticky = std.random(1, 100);
    }
    # use to be client.identity in V3
    set req.backend_hint = cdir.backend(req.http.sticky);
}

sub vcl_deliver {
    # persist the cookie
    # we need to use the header vmod as there might be a set-cookie 
    # header on the object already and
    # we don't want to mess with it
    if (req.http.sticky) {
        header.append(resp.http.Set-Cookie,"sticky=bar" + req.http.sticky + "; Expires=" + cookie.format_rfc1123(now, 60m));
    }
}
Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...