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;