Mar 062012
 

Installation debian de la dernière version :

curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
echo "deb http://repo.varnish-cache.org/debian/ squeeze varnish-3.0" >> /etc/apt/sources.list.d/varnish.list
apt-get update
apt-get install varnish

Modification du /etc/default/varnish pour y mettre :

START=yes
NFILES=131072
MEMLOCK=82000
DAEMON_OPTS="-a :80 \
             -T :6082 \
             -f /etc/varnish/default.vcl \
                -s malloc,4g
                -p thread_pools=8 \
                -p thread_pool_max=4000 \
                -p thread_pool_min=100 \
                -p thread_pool_add_delay=2 \
                -p default_grace=300 \
                -p default_ttl=300 \
                -p ban_lurker_sleep=0.01"

Paramètres à modifier :

  • NFILES : maximum openfiles (utilisé pour faire un ulimit -n au démarrage)
  • MEMLOCK : mémoire partagée maximum pour les cores/threads (utilisé pour faire un ulimit -l au démarrage)
  • -a : port d’écoute de Varnish
  • -T : port d’écoute de l’administration
  • -f : fichier de configuration des routines et des backends
  • -s malloc : cache en ram avec une taille (en octets)
  • -p thread_pools : nombre de core
  • -p thread_pool_min : 800/nombre de core
  • -p thread_pool_max : nombre maximum de thread
  • -p thread_pool_add_delay : temps d’attente qu’un thread se libère avant d’en démarrer un supplémentaire (en ms)
  • -p default_grace : temps que les objets reste en cache après le ttl si le ou les backends ne sont pas disponibles
  • -p default_ttl : temps de rafraichissement des objets par défaut
  • -p ban_lurker_sleep : temps entre chaque passage du ban lurker pour nettoyer les vieux objets en cache et ainsi nettoyer la liste des bans
Mar 062012
 

Vous pouvez limiter l’accès à un site ou une partie du site avec Varnish.
C’est utile car les limitations par IP au niveau Apache2 ne fonctionne pas avec Varnish, car les IPs clients détectées sont celle du Varnish.
Ajoutez une acl avec la liste de vos IPs autorisées.

acl iplimit {
        {"1.2.3.4"};
        {"9.8.7.6"};
}

Ensuite ajoutez dans le vcl_recv par exemple :

if (!(client.ip ~ iplimit)) {
        return(error);
}
Mar 062012
 

Ajoutez dans vcl_recv :

if(req.http.cookie !~ "wordpress_logged_in" ) {
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-(1|2)=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-(1|2)=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "comment_author_[a-z0-9]+=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "comment_author_email_[a-z0-9]+=[^;]+(; )?", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "comment_author_url_[a-z0-9]+=[^;]+(; )?", "");
        if (req.http.cookie ~ "^$") {
                unset req.http.cookie;
        }
}
Mar 052012
 

Avec varnish, par défaut quand vous appelez la routine pass,

return(pass);

votre requête sera envoyée directement au backend sans vérifier le cache mais si la réponse est « cachable » http://blog.jeremm.fr/?p=190, Varnish la sauvegardera dans son cache.

Bien sûr cela ne sert souvent à rien car la prochaine requête passera encore par le routine pass, et l’objet dans le cache ne sera pas utilisée.
Mais avec une configuration plus complexe, l’objet en cache pourrait être utilisé.

Pour être sûr que les objets passant par la routine pass ne soit pas cachée, ajoutez :

sub vcl_pass {
        set req.http.X-marker = "pass" ;
}

et dans le vcl_fetch :

if (req.http.X-marker == "pass" ) {
        unset req.http.X-marker;
        set beresp.ttl = 0s ;
}
Mar 052012
 

Pour savoir comment Varnish décide si un objet peut être caché :

Varnish regarde deux paramètres dans l’en-tête HTTP que lui renvoie le backend.

  • La date du paramètre Expires :
  1. Si il est dans le passé, il ne cache pas
  2. Si il est dans le futur, il cachera jusqu’à la date.
  • La valeur du s-maxage ou max-age du paramètre Cache-Control :
  1. Si il est égal à 0, il ne cachera pas
  2. Si il est supérieur à 0, il cachera le nombre de seconde que ce paramètre lui dit (avec ce paramètre, Varnish ne regardera pas le paramètre Expires)

Si aucun des deux paramètres n’est présent, Varnish cachera l’objet avec le temps de rafraichissement par défaut.

Vous pouvez bien sûr ajouter des règles pour forcer ou non des objets dans le cache.