Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Un proxy – c’est quoi ?

Slide 4

Slide 4 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Proxy « sortant » – à la sortie de son réseau

Slide 5

Slide 5 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Reverse-proxy – à l’entrée d’une infra

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Équilibrage de charge Tolérance de panne

Slide 8

Slide 8 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022

Slide 9

Slide 9 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022

Slide 10

Slide 10 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Frontend le guichet d’entrée

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Backend vers l’arrière-boutique

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022

Slide 19

Slide 19 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Cache HTTP

Slide 20

Slide 20 text

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)

Slide 21

Slide 21 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Cache HTTP – cas de la connexion directe

Slide 22

Slide 22 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Cache HTTP – cas du proxy local

Slide 23

Slide 23 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Cache HTTP – cas du reverse proxy cache

Slide 24

Slide 24 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Cache HTTP – quel intérêt ?

Slide 25

Slide 25 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Cache HTTP – quel intérêt ?

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Cache HTTP – économie de transfert

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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= # age max Expires: # date de création + age max Last-Modified: # date de création ETag: A0B4C8D1E1F9 # si possible, pour faciliter le cache

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022

Slide 36

Slide 36 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Varnish – guru meditation

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 HAProxy + Varnish = Boost

Slide 42

Slide 42 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Boost – le protocole PROXY pour simplifier

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Haute-dispo – côté applicatif

Slide 48

Slide 48 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Haute-dispo – côté Boost

Slide 49

Slide 49 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Haute-dispo – côté Boost

Slide 50

Slide 50 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 Conclusion

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

Evolix – Grégory Colpart & Jérémy Lecour – Capitole du Libre 2022 MERCI à vos questions