Varnish et son " stockage "

Introduction Varnish peut cacher les données en mémoire et/ou sur disque. On peut donc lui dire qu’on lui alloue 512Mo de mémoire pour cacher et aussi 95% de l’espace libre d’une partition en ajoutant les paramètres ci-dessous : -s malloc,512M \ -s file,/var/lib/varnish/varnish_storage.bin,95% Le stockage “ Transient ” Varnish a aussi par défaut, un cache en mémoire pour les objets de courte durée, ce cache n ‘a pas de limite par défaut, ce fonctionnement par défaut peut donc faire swaper et cracher votre serveur (ou le mien 🙂 ) Ce cache ce nome “ Transient Storage ” Pour limiter ce cache et donc contrôler totalement l’utilisation en mémoire de vos varnish ajouter aux options du daemon [Voir plus]

Protection contre le hotlinking avec Varnish

Voici un exemple de condition à ajouter dans votre vcl recv pour protéger un dossier d’un site :

if (req.http.host == "le.domaine.a.proteger.ltd" && req.url ~ "^/l/uri/a/proteger" && (req.http.referer && req.http.referer !~ "^http://le.domaine.a.proteger.ltd/")) {
    error 403 "No hotlinking please";
}

Remplacer :

  • le.domaine.a.proteger.ltd par le domaine (attention si votre site est accessible avec et sans www)
  • /l/uri/a/proteger : par l’uri à protéger, supprimer cette partie si vous voulez protéger l’intégralité du site

Pour mettre en place le même type de protection via apache, voir cet article : Un htaccess pour les pompeurs de sites dans lequel est expliqué comment procéder avec des règles de réécriture Apache

Loadbalancing avec Sticky bit

La documentation Varnish parle de loadbalancing aléatoire et Round Robin, mais n’indique pas comment loadbalancer en conservant les sessions La configuration ci-dessous ne se base pas sur les IP sources mais sur un cookies pour identifier un client Backends ```backend serveur1 { .host = “192.168.0.1”; .port = “80”; } backend serveur2 { .host = “192.168.0.2”; .port = “80”; }``` Configuraiton du Loadbalancing director member client { { .backend = serveur1; .weight = 1; } { .backend = serveur2; .weight = 1; } } Sticky Bit Dans vcl_recv définissez sur quoi doit se baser Varnish pour définir “l’identité” du client [Voir plus]

Varnish est plus intelligent que vous !

Utiliser la configuration built-in Comme nous l’indique ops42 dans son article http://ops42.wordpress.com/2012/11/14/varnish-is-smarter-than-you/. pdf de la page qui n’existe plus 🙁 , Varnish fonctionne très bien avec sa configuration “built-in”. Au fur et à mesure, beaucoup de sysops (comme moi) ont mis en place, à tord, des configurations Varnish de plus en plus complexe. La seule configuration à mettre en place est celle lié à vos backends Objectif d’une modification de vcl Toutes modification des VLC sera donc un hotfix pour corrigé un problème lié a votre application. Exemple OpenPhoto à actuellement un bug, un css est géré a chaque hit, cela ajoute au minimum 5 secondes au temps de changement de la page. [Voir plus]

Template Varnish

Le but de cette configuration est de simplifier au maximum la mise en place de Varnish.

Avant d’appliquer la configuration a votre Varnish, vous devez éditer le fichier backend.vcl pour configurer votre backend.

Cette configuration reste minimaliste et utilise la configuration “ builtin ” qui fonctionne très bien à conditions que les RFC soient respecté.

Conserver l'IP du client derrière un reverse proxy

Lorsque Nginx est placé derrière un reverse proxy, celui ci avec une configuration de base logera l’ip des visiteur avec celle du reverse proxy et non avec l’ip des visiteurs.

Cela peut poser des problemes par exemple dans le cas ou vous utilisez Akismet comme antispam pour vos commentaires.

Pour cela, dans varnish ajouter apres

sub vcl_recv {

la ligne

set req.http.X-Forwarded-For = client.ip;

puis dans la configuration Nginx, dans la configuration http, ajouter

  set_real_ip_from 127.0.0.1;
  real_ip_header X-Forwarded-For;

Configurer Varnish pour Drupal

Dans cet article, uniquement les spécificité de configuration pour Drupal seront indiqué

Dans la vcl_recv, on nettoie les cookies si vous ne l’avez pas déjà fait :

set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", "");
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.http.Cookie ~ "^\s*$") {
    unset req.http.Cookie;
}

On spécifie ce qu’il faut cacher, ou pas :

if (req.url ~ "^/sites/") {
    unset req.http.Cookie;
}
if (req.url ~ "^/misc/") {
    unset req.http.Cookie;
}
if (req.url ~ "^/modules/.*\.(js|css)\?") {
    unset req.http.Cookie;
}
if (req.url ~ "cron.php") {
    return (pass);
}

Configuration de Varnish

Mise en place du dépôt Varnish et installation Pour cela, il faut : Installer la clef PGP du dépôt Varnish Ajouter le dépôt Varnish Installer Varnish curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add - echo "deb http://repo.varnish-cache.org/debian/ $(lsb_release -s -c)varnish-3.0" >> /etc/apt/sources.list.d/varnish.list apt-get update apt-get install varnish``` # Activation de varnish et configuration du port 80 a la place du port 6081 ```sh sed -i "#START#s#no#yes#" /etc/default/varnish- sed -i "s#-a :6081#-a :80#" /etc/default/varnish sed -i "s#/etc/varnish/default.vcl#/etc/varnish/production.vcl#" /etc/default/varnish Le fichier de configuration backend default { .host = "127.0.0.1"; .port = "8080"; } Appelé au début d’une requête, après que la requête complète est été reçue et analysée. [Voir plus]