Avant de commencer une série d’articles sur Varnish, il me semble important de faire un petit détour sur son fonctionnement. Je me suis basé ici sur Wikipedia et la documentation de Varnish.

C’est quoi ?

Varnish est un reverse proxy, un accélérateur web conçu dès le départ pour ce rôle précis. Pour accélérer l’accès à un site web, le contenu va être caché en mémoire (ou sur disque, tout dépendra de la configuration). Le site web n’a donc plus à recréer la page demandée, elle est directement servie par Varnish. C’est une économie pour toute la chaîne derrière Varnish. Passé un délai, si une page plus récente est disponible, Varnish cachera de nouveau cette page…

Varnish est opensource sous licence FreeBSD. Il existe une documentation claire et un support commercial est proposé par varnish-software. Dans les clients de varnish-software, on retrouve par exemple Facebook.

Architecture/Performance

Le gros plus de Varnish par rapport à Squid par exemple, c’est qu’il stocke ses données en mémoire virtuelle et laisse le kernel décider de ce qu’il doit en faire (placer l’objet en RAM ou sur disque). Dans la même idée, afin de réduire les appels systèmes, Varnish logue en mémoire partagée. L’accès, le formatage et l’écriture des logs sont délégués à d’autres applications. Attention donc, par défaut il n’y a pas de log d’accès à vos sites derrière Varnish ! Pensez-y si vous avez, par exemple, besoin de ces logs pour vos statistiques… Un article intéressant au sujet de l’architecture de Varnish et de sa gestion de la mémoire : So what’s wrong with 1975 programming ?.

Varnish est multi-threadé : chaque nouvelle connexion est un nouveau thread. Quand la limite de threads actifs est atteinte, la connexion entrante suivante est placée en queue. C’est uniquement quand celle-ci aura atteint sa limite que la connexion sera rejetée.

La configuration de Varnish se fait via VCL (Varnish Configuration Language). La configuration est directement convertie en C puis compilée en tant qu’objet partagé utilisable par Varnish (le tout à chaud). Il est même possible d’insérer directement du code C. On peut intervenir sur plusieurs paramètres, comme la taille du cache, la limite de threads, les timeouts. Une interface en ligne de commande permet d’intervenir sur ces paramètres, sur le fonctionnement global de Varnish, de charger de nouvelles configurations VCL, le tout sans avoir à redémarrer Varnish. Une partie de la norme ESI est supportée : il est possible de cacher une partie d’une page web dynamique.

Varnish supporte le load balancing a base de round-robin et utilise un système simple de vérification de l’état du backend en interrogeant, par exemple, une page web donnée. Il est capable ainsi, de ne plus envoyer de requête à un backend qui ne répond plus.

Varnish 3 : quoi de neuf ?

Beaucoup de choses ! Compression/décompression à la volée (même avec ESI), les modules Varnish (vmods), optimisation VCL, support du streaming (avec compression et décompression).

Le changelog complet est disponible ici.

A suivre…