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)
◦ manipule des messages HTTP
• 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_hint = 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
Désactivé par défaut depuis Varnish 4
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
• ...
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 ;)