Configuration avancée de Varnish : Mutli-domaines et cookies

Dans un article précédent j’ai détaillé le fonctionnement de Varnish ainsi que des différentes subtourines. Dans cet article je vais  vous détailler comment gérer différents sites / backends. Ensuite comment bypasser le système de cache via les cookies ou url.
Puis je vais ajouter un morceau de code VCL pour faire du ménage dans les cookies. Le backend n’a pas besoin de recevoir les cookies.

Filtrer les domaines à cacher

Si votre varnish est le point d’entrée de plusieurs sites il est possible de filtrer lesquels cachés, et de spécifier quel backend interroger.
Il faut modifier le vcl_init, pour définir plusieurs vdir. Un vdir est un regroupement de backend.

sub vcl_init {
   new vdir1 = directors.round_robin();
   vdir1.add_backend(backend1);
   vdir1.add_backend(backend2);

   new vdir2 = directors.round_robin();
   vdir2.add_backend(backend3);
}

Puis il faut rajouter ce code dans la fonction vcl_recv

if (req.http.host ~ "monsite.fr$") {
   # send all traffic to the vdir1 director
   set req.backend_hint = vdir1.backend();
} elsif (req.http.host ~ "othersite.fr$") {
   set req.backend_hint = vdir2.backend(); 
} else {
   return(pipe);
}

Bypasser le cache

Par défaut, Varnish ne cache pas les pages contenant certains header (comme no-cache, private), mais il est également  possible de le bypasser en rajoutant un filtre sur l’url et/ou sur  la présence de cookies. Utilise pour gérer l’accès aux pages d’admin ou si vos utilisateurs connectés ont besoin de voir le contenu en temps réel.
J’ai créé le fichier bypas.vcl avec ces deux méthodes.

sub bypass_varnish_cookies {
   # Check the cookies for bypass Varnish cache
   if (req.http.Cookie ~ "cookie1") {
      return (pass);
   }
}

sub bypass_varnish_urls {
   # Don't cache some URLs (security in case missing header in PHP)
   if (req.url ~ "/(.*)monurl.html") {
      return(pass);
   }
}

Il faut maintenant appeler ces deux méthodes dans la fonction vcl_recv

call bypass_varnish_cookies;
call bypass_varnish_urls;

 

Nettoyer les cookies inutiles

Il vous suffit de créer un fichier cookies.vcl avec le contenu suivant  :
On va supprimer les cookies de Google Analytics  et autre service externe.

sub cookies_vcl_recv {
   # removes all cookies named __utm? (utma, utmb...) - tracking thing
   set req.http.Cookie = regsuball(req.http.Cookie, "(^|(?<=; )) *__utm.=[^;]+;? *", "\1");

    # Remove any Google Analytics based cookies
    set req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "_ga=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "_gat=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "utmctr=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "utmcmd.=[^;]+(; )?", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "utmccn.=[^;]+(; )?", "");

    # Remove DoubleClick offensive cookies
    set req.http.Cookie = regsuball(req.http.Cookie, "__gads=[^;]+(; )?", "");

    # Remove the Quant Capital cookies (added by some plugin, all __qca)
    set req.http.Cookie = regsuball(req.http.Cookie, "__qc.=[^;]+(; )?", "");

    # Remove the AddThis cookies
    set req.http.Cookie = regsuball(req.http.Cookie, "__atuv.=[^;]+(; )?", "");

    # Remove a ";" prefix in the cookie if present
    set req.http.Cookie = regsuball(req.http.Cookie, "^;\s*", "");

    # Are there cookies left with only spaces or that are empty?
   if (req.http.Cookie == "" || req.http.cookie ~ "^\s*$") {
      unset req.http.Cookie;
   }
}

Comme dans l’exemple précédent il ne vous reste plus qu’a appeler cette fonction dans vcl_recv

call cookies_vcl_recv;