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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 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

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

  14. 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

    View Slide

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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

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

    View Slide

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

    View Slide

  20. 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)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

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

    View Slide

  29. 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

    View Slide

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

    View Slide

  31. 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

    View Slide

  32. 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

    View Slide

  33. 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

    View Slide

  34. 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

    View Slide

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

    View Slide

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

    View Slide

  37. 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

    View Slide

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

    View Slide

  39. 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

    View Slide

  40. 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

    View Slide

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

    View Slide

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

    View Slide

  43. 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

    View Slide

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

    View Slide

  45. 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

    View Slide

  46. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. 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

    View Slide

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

    View Slide