Share
Embed
Accélération web avec HAProxy et Varnish
En tant qu'hébergeur et infogérant, nous utilisons depuis de nombreuses années HAProxy pour du load-balancing et Varnish pour du cache HTTP. Nous présenterons de manière simple et imagée les concepts de proxy, de load-balancing et de cache HTTP.
Nous montrerons aussi comment nous avons combinés HAProxy et Varnish pour proposer à nos clients une solution d'accélération web et de haute disponibilité.
Jérémy Lecour
November 19, 2022
Transcript
52 slides
-
Perfs web et haute-dispo Load-balancer tout avec HAProxy Cache-cash avec
Varnish Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 On en parle – ou pas ! • web • forte-performance • haute-dispo • bases de données • cache applicatif • load-balancing • reverse-proxy • cache HTTP -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Un proxy – c’est quoi ? -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Proxy « sortant » – à la sortie de son réseau -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Reverse-proxy – à l’entrée d’une infra -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Headers HTTP – en tête-à-tête $ curl -sv https://jeremy.lecour.fr/blog/ GET /blog/ HTTP/1.1 Host: jeremy.lecour.fr User-Agent: curl/7.74.0 Accept: */* HTTP/1.1 200 OK Date: Thu, 8 Nov 2022 09:32:30 GMT Server: Apache Last-Modified: Tue, 19 May 2020 16:59:15 GMT ETag: "23c8-5a603330a9ec0" Accept-Ranges: bytes Content-Type: text/html X-Frame-Options: DENY X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Content-Security-Policy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self' Strict-Transport-Security: max-age=63072000 command line -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Équilibrage de charge Tolérance de panne -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Frontend le guichet d’entrée -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Frontend – multi-protocoles • TCP ou HTTP • HTTP 1.x, HTTP/2, HTTP/3 ; QUIC -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Frontend – manipulation des requêtes frontend external # X-Forwarded-* headers option forwardfor http-request set-header X-Forwarded-Proto https if { ssl_fc } # Add unique ID to each request http-request set-header X-Unique-ID %[uuid()] unless { hdr(X-Unique-ID) -m found } # Redirect to HTTPS http-request redirect scheme https code 301 unless { ssl_fc } # Redirect example-from.org → example-to.org http-request redirect prefix https://example-to.org code 301 if { hdr(host) example-from.org } # HTTP Basic Auth http-request auth realm "VIP Section" unless { http_auth(vip_users) } haproxy.cfg -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Frontend – erreurs personnalisées frontend external # List of IP that will not go the maintenance backend acl maintenance_ips src -f /etc/haproxy/maintenance_ips # Go to maintenance backend, unless your IP is whitelisted use_backend maintenance if !maintenance_ips backend maintenance http-request set-log-level silent # Custom 503 error page errorfile 503 /etc/haproxy/errors/maintenance.http # With no server defined, a 503 is returned for every request haproxy.cfg -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Frontend – aiguillage frontend external acl example_com_domains hdr(host) -i example.com acl foo_bar_domains hdr(host) -i foo-bar.com foo-bar.org use_backend example_com if example_com_domains use_backend foo_bar if foo_bar_domains backend example_com server srv10-1 192.0.10.1:80 backend foo_bar server srv20-1 192.0.20.1:80 server srv20-2 192.0.20.2:80 haproxy.cfg -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Backend vers l’arrière-boutique -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Backend – répartition de charge et tolérance de panne backend single server srv10-1 192.0.10.1:80 backend parallel balance roundrobin option httpchk HEAD /ping server srv20-1 192.0.20.1:80 weight 100 server srv20-2 192.0.20.2:80 weight 50 backend redis mode tcp balance first default-server check observe layer4 agent-check agent-port 16379 ⤷ on-marked-down shutdown-sessions on-marked-up shutdown-backup-sessions server redis-1 192.0.30.1:6379 server redis-2 192.0.30.2:6379 haproxy.cfg -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 HAProxy – autres concepts • résolveur DNS • interface de stats/admin • data-plane API • extensions (scripts Lua) • délégations externes (WAF, MFA…) • logging personnalisable -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – par qui ? pour qui ? • un standard : RFC 2616, RFC 7234 • utile pour les SysAdmins • très utile pour les développeurs (web) -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – cas de la connexion directe -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – cas du proxy local -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – cas du reverse proxy cache -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – quel intérêt ? -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – quel intérêt ? -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – que dit la RFC ? • un client HTTP peut envoyer Cache-control • un serveur HTTP peut envoyer Cache-control et Expires • un proxy-cache HTTP doit envoyer Age -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – des en-têtes de requête et de réponse -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – 304 Not Modified 1. un serveur envoie des ETag et/ou Last-Modified 2. un client (ou proxy) sollicite avec If-None-Match ou If-Modified-since pour évaluer la fraîcheur du cache local 3. si le contenu n’a pas changé, le serveur répond 304 Not Modified -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – économie de transfert -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Cache HTTP – les en-têtes, le retour • Expires / max-age • Cookies / Set-Cookie • Authorization • Vary • Pragma -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Question fréquente #1 « Quel(s) en-tête(s) HTTP dois-je renvoyer pour permettre explicitement la mise en cache ? » Cache-Control: public, max-age=<seconds> # age max Expires: <http-date> # date de création + age max Last-Modified: <http-date> # date de création ETag: A0B4C8D1E1F9 # si possible, pour faciliter le cache -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 « Quel(s) en-tête(s) HTTP dois-je renvoyer pour empêcher complètement la mise en cache ? » Question fréquente #2 Cache-Control: no-cache, no-store, must-revalidate, max-age=0 Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 • préférable de toujours le renvoyer • obligatoire pour un contenu dynamique • préciser la date d’expiration si le cache est possible • ...sinon des proxy pourraient garder en cache à vie « Dois-je toujours renvoyer un en-tête HTTP Cache-control ? » Question fréquente #3 -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Varnish – guru meditation -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Varnish – la crème du cache • logiciel libre créé en 2006 • forte optimisation ; relativement léger, tout en RAM • config basée sur des fonctions, compilées au démarrage (VCL) • conventions de base, à surcharger -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Varnish – quelques concepts • VCL : if () { return (); } • TTL : max-age ou beresp.ttl • unset req.http.cookie / beresp.http.set-cookie • curl -X PURGE • cache ESI -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 PURGE – ça s’en va et ça revient sub vcl_recv { if (req.http.host == "example.com" && req.method == "PURGE") { if (client.ip == "198.51.100.4" || client.ip == "198.51.100.5") { if (req.url == "/_purge_all") { ban("req.http.host == " + req.http.host + " && req.url ~ ."); return (synth(200, "ALL purge cache done")); } else { ban("req.http.host == "+req.http.host+" && req.url ~ "+req.url); return (synth(200, "purge cache done")); } } else { return (synth(403, "permission denied")); } […] varnish.vcl -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 HAProxy + Varnish = Boost -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Boost – le protocole PROXY pour simplifier X-Forwarded-For: 192.0.2.1,127.0.0.1,127.0.0.1,203.0.113.1 -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Boost – le protocole PROXY pour simplifier -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Boost – gestion des certificats TLS/SSL • gestion centralisée (Let’s Encrypt ou CA « classiques ») • déploiement automatique -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Boost – multi-sites • Ansible pour automatiser • HAProxy : config monolithique • Varnish : config éclatée -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Haute-dispo – côté applicatif -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Haute-dispo – côté Boost -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Haute-dispo – côté Boost -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 Conclusion -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 HAProxy/Varnish, écologique ? • question difficile… • moins de requêtes « lourdes » • moins de serveurs • mais « effet rebond » • Logiciel Libre -
Evolix – Grégory Colpart & Jérémy Lecour – Capitole du
Libre 2022 MERCI à vos questions