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 🙂 ) {.warning}

[Lire]

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

[Lire]

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";
}

Configuration 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 set client.identity = req.http.cookie;

[Lire]

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.

[Lire]

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 problèmes par exemple dans le cas ou vous utilisez Akismet comme anti-spam pour vos commentaires.

Pour cela, dans varnish ajouter après

sub vcl_recv {

la ligne

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

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

[Lire]

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.

[Lire]