varnishd
backend
c1
c2
c3
Le tour de Varnish en 30 minutes.
« Si Jules Verne avait imaginé le Web,
on trouverait Varnish dans son roman. »
Dridi B.
Et donc ?
C'est quand meme une super
distinction pour Varnish
Software et a l'echelle
europeene ! On parle de plus
en plus de Varnish un peu
partout en ce moment.
C'est quoi Varnish ?
Hum...
A propos de moi
Consultant
Formateur
Rédacteur
Conseil/Support
Formateur certifiant
Contributeur
Fanboi Linux
Fedora Packager
Editor InfoQ FR
A propos de moi
Developer
Trainer/Speaker
Presales
Uncontributor
Modder
Blogger
Fanboi Linux
Fedora Packager
Editor InfoQ FR
<insert joke about old
people and poor memory>
pkg_add -r varnish
pkg install varnish
yum install varnish
aptitude install varnish
apt-get install varnish
zypper install varnish
pacman -S varnish
emerge varnish
W
T
F
?
$ rpm -ql varnish | grep bin
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishreplay
/usr/bin/varnishsizes
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/sbin/varnish_reload_vcl
/usr/sbin/varnishd
$ rpm -ql varnish | grep bin
/usr/bin/varnishadm
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
/usr/sbin/varnish_reload_vcl
/usr/sbin/varnishd
VCL - Varnish Configuration Language
• Contient la politique de cache
• Domain Specific Language (DSL)
• Proche du Perl (connu de nos admins ;)
• Transformé en C puis compilé
• Modifications à chaud
• Expose un automate fini
• Propose des règles par défaut
VCL - Varnish Configuration Language
sub vcl_recv {
if (req.url ~ "^/admin") {
return (pass);
}
}
sub vcl_deliver {
unset resp.http.X-Varnish;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;
}
VCL - Varnish Configuration Language
VCL - Varnish Configuration Language
v4
Back-ends & ...
backend www {
.host = "www.example.com";
.port = "http";
.connect_timeout = 1s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 2s;
.probe = {
.url = "/health-check";
.timeout = 0.3s;
.window = 8;
.threshold = 3;
.initial = 3;
}
}
Back-ends & Virtual Hosts
backend www {
.host = "projet-prod-www";
# first => default
}
backend static {
.host = "projet-prod-static";
}
sub vcl_recv {
if (req.http.Host ==
"static.example.com") {
set req.backend = static;
}
}
• Varnish gère:
◦ le TTL
◦ les variantes (entête Vary)
◦ le gzip
• Le VCL par défaut ne cache pas:
◦ les cookies
◦ les authentifications
◦ les méthodes autres que GET ou HEAD
Cache => Invalidation
• purge
◦ via le VCL
◦ immédiat
◦ une URL à la fois
• ban
◦ via le VCL
◦ via la console d'admin
◦ différé
◦ critères plus variés
◦ invalide des régions
Accorder un sursis
grace
• TTL étendu
• Sert du contenu périmé
Utile en cas de:
• défaillance d'un backend
• redémarrage d'un backend
• rafraîchissement long
Requêtes conditionnelles
keep
• TTL étendu
• Pour revalidation
Entêtes concernées
• Last-Modified
• If-Modified-Since
• Etag
• If-None-Match
Director != Load Balancer
• Maximise les chances d'obtenir une ressource
• Plusieurs stratégies:
◦ random
◦ round robin
◦ fallback
◦ client (sticky)
◦ hash
◦ DNS
• Peut servir de répartiteur de charge
Director != Load Balancer
• Maximise les chances d'obtenir une ressource
• Plusieurs stratégies:
◦ random
◦ round robin
◦ fallback
◦ hash (sticky, sharding...)
• Peut servir de répartiteur de charge
◦ Possibilité d'écrire le sien
Director != Load Balancer
backend www1 {
.host = "projet-prod-www-1";
}
backend www2 {
.host = "projet-prod-www-2";
}
backend www3 {
.host = "projet-prod-www-3";
}
director www fallback {
{ .backend = www1; }
{ .backend = www2; }
{ .backend = www3; }
}
Director != Load Balancer
import directors;
backend www1 { .host = "host1"; }
backend www2 { .host = "host2"; }
backend www3 { .host = "host3"; }
sub vcl_init {
new www = directors.fallback();
www.add_backend(www1);
www.add_backend(www2);
www.add_backend(www3);
}
sub vcl_recv {
set req.backend_hint = www;
}
Director ~= Transport
Transport vers le backend
• Sélectionner une route
• Ouvrir une connexion TCP
• Envoyer une requête HTTP/1
Autres transorts
• Un backend est un director HTTP/TCP
• D'autres transports existent
• FS, *CGI, UNIX, QUIC, ...
• Mais pour ça il faut étendre Varnish
♥
N
Y
C{ extend_varnish(); }C
Insérer du C dans le VCL
• pour accéder aux entrailles de Varnish
• rappel : le VCL est transformé en C
Désuet depuis Varnish 3
• architecture modulaire
• VMOD => Varnish Module
VMOD
import std;
sub vcl_error {
synthetic std.fileread("/etc/varnish/"
+ obj.status + ".html");
}
Il en existe d'autres :
• https://www.varnish-cache.org/vmods
• support commercial possible pour certains
varnishadm
Un shell pour contrôler Varnish
• diagnostics
• tuning
• gestion du VCL
• debug (caché =)
• man varnish-cli
Certaines opérations sont scriptables !
One tool to rule them all
Journal de bord du capitaine
Constat sur les logs:
• personne ne les lit/exploite...
• ... sauf quand un problème survient
• souvent trop/pas assez verbeuses
• problèmes de perfs/espace disque
La solution Varnish:
• des logs binaires en mémoire
• des outils pour les exploiter
Journal de bord du capitaine
Deux types de logs:
• des compteurs
• des événements
Les outils:
• varnishlog
• varnishstat
• varnishncsa
• varnishhist
• ...
Le détour Varnish 4 en 15 minutes.
Quoi de neuf dans Varnish 3 ?
• Des améliorations du VCL
• L'invalidation avec ban en plus de la purge
• L'apparition des modules
• La (dé)compression gzip à la volée
• Un support partiel du streaming
Quoi de neuf dans Varnish 4 ?
Les changements dans le VCL
• Un marqueur "vcl 4.0"
• Des étapes renommées
• De nouvelles étapes
• De nouvelles fonctions
• Des objets (comme dans orienté objet)
• Un nouveau module : vmod_directors
vmod_directors
# varnish 3
director www fallback {
{ .backend = www1; }
{ .backend = www2; }
{ .backend = www3; }
}
# varnish 4
sub vcl_init {
new www = directors.fallback();
www.add_backend(www1);
www.add_backend(www2);
www.add_backend(www3);
}
Du streaming partiel ?
Pas de màj concurrentes d'un "objet" du cache
• latence pendant le rafraîchissement d'un objet
• streaming possible pour le premier client
• les clients suivants doivent attendre
Contournable
• par le mécanisme de grace
• par un hack en VCL
v3
Un support complet du streaming ?
Pas de màj concurrentes d'un "objet" du cache
• des threads "clients" et "backends"
• un thread "backend" se charge de la màj
• streaming possible pour les threads "clients"
Bénéfices ?
• une architecture encore plus réactive
• suppression des latences d'un "cache miss"
• améliore la mise en cascade de caches
La sécurité dans Varnish 4
La sécurité dans Varnish 4
Architecture de varnishd
• deux processus "management" et "cache"
• paramètres et VCL modifiables à chaud
• VCL transformé en C puis compilé
• pas de chiffrement (SSL/TLS)
Nouveautés
• paramètres en lecture seule
• C{ inline_c(); }C désactivé par défaut
Les modules dans Varnish 4
• Nouveaux types (IP, BACKEND, BLOB...)
• Des objets manipulables dans le VCL
• De nouveaux points d'entrée
• delivery pipeline
• fetch processors
• Gestion de la documentation
Les logs dans Varnish 4
• Nouvelle architecture
• Meilleures performances (zero copy)
• Transactions et groupes de transactions
• Un langage de requêtes
• Filtrage des logs
Les logs dans Varnish 4
Transactions
• requête du client
• requête au backend
• sous-requête ESI
• session
Groupes de transactions
• par VXID
• par requête
• par session
• brut (raw)
varnishlog -g {vxid | request | session | raw}
Les logs dans Varnish 4
Langage de requêtes
• comparaisons de chaînes
• comparaisons de nombres
• expressions régulières
• opérateurs logiques
• ...
-q 'ReqMethod eq "GET" and ReqUrl !~ "^/static"'
-q 'RespStatus >= 200 and RespStatus < 300'
Quoi de neuf dans Varnish 4 ?
• Des améliorations du VCL
• Une architecture encore plus réactive
• Un support complet du streaming
• Une sécurité accrue
• De nouveaux points d'extension pour les modules
◦ un nouveau vmod_directors
• Une refonte de la gestion des logs
Pourquoi c'est important
La vitesse compte:
• la lenteur perçue fait perdre des visiteurs
• perdre des visiteurs fait baisser les ventes
Varnish est rapide:
• il diminue la charge des backends
• il peut masquer les maintenances
• la requête la plus rapide est celle qu'on ne fait pas
Varnish en 5 étapes
• Cacher le contenu statique
• Configurer la compression
• Cacher le contenu semi-statique
• Automatiser l'invalidation du cache
• Améliorer les backends
Autres fonctionnalités
• Access Control Lists (ACL)
• Multi-tenancy
• Framework de test
• Edge Side Includes (ESI)
Et on trouve même des man pages ;)