Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Accélération web avec HAProxy et Varnish

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
Tweet

More Decks by Jérémy Lecour

Other Decks in Technology

Transcript

  1. 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
  2. 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
  3. Evolix – Grégory Colpart & Jérémy Lecour – Capitole du

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

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

    Libre 2022 Reverse-proxy – à l’entrée d’une infra
  6. 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
  7. Evolix – Grégory Colpart & Jérémy Lecour – Capitole du

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

    Libre 2022 Frontend le guichet d’entrée
  9. 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
  10. 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
  11. 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
  12. 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
  13. Evolix – Grégory Colpart & Jérémy Lecour – Capitole du

    Libre 2022 Backend vers l’arrière-boutique
  14. 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
  15. 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
  16. 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)
  17. Evolix – Grégory Colpart & Jérémy Lecour – Capitole du

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

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

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

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

    Libre 2022 Cache HTTP – quel intérêt ?
  22. 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
  23. 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
  24. 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
  25. Evolix – Grégory Colpart & Jérémy Lecour – Capitole du

    Libre 2022 Cache HTTP – économie de transfert
  26. 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
  27. 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
  28. 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
  29. 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
  30. Evolix – Grégory Colpart & Jérémy Lecour – Capitole du

    Libre 2022 Varnish – guru meditation
  31. 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
  32. 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
  33. 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
  34. 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
  35. Evolix – Grégory Colpart & Jérémy Lecour – Capitole du

    Libre 2022 Boost – le protocole PROXY pour simplifier
  36. 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
  37. 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
  38. Evolix – Grégory Colpart & Jérémy Lecour – Capitole du

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

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

    Libre 2022 Haute-dispo – côté Boost
  41. 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