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 • ... 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 ;)