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