web-dev-qa-db-fra.com

Comment puis-je activer HTTP / 2 sur HAProxy?

Nous sommes récemment passés du HTTP au HTTPS. Comme nous sommes déjà passés au HTTPS, nous envisageons de passer au HTTP/2 pour obtenir des avantages en termes de performances.

enter image description here

Comme expliqué ci-dessus, les demandes entre le navigateur et le LB sont sécurisées (HTTPS) tandis que la communication entre le LB et le serveur d'application utilise toujours HTTP

Quelle est la possibilité d'activer HTTP/2 avec la configuration actuelle? Peut-on activer HTTP/2 entre le navigateur et LB pendant que la communication entre LB et les serveurs d'application reste sur HTTP?

17
ssharma

HAProxy 1.8 prend en charge HTTP/2

De l'annonce 1.8 :

HAProxy 1.8 prend désormais en charge HTTP/2 côté client (dans les sections frontales) et peut servir de passerelle entre les clients HTTP/2 et vos applications HTTP/1.1 et HTTP/1.0.

Vous aurez besoin du h2 directive dans votre haproxy.conf. De Guide HAProxy HTTP/2 de CertSimple et équilibrage de charge dynamique:

frontend myapp
  bind :443 ssl crt /path/to/cert.crt alpn h2,http/1.1
  mode http

Anciennes versions de HAProxy

Les versions plus anciennes de HAProxy comme 1.6 et 1.7 ne prennent en charge que HTTP/2 - c'est-à-dire, diriger le trafic vers un serveur d'application séparé qui prend en charge HTTP/2. C'est beaucoup plus compliqué - voir d'autres réponses sur la façon de procéder. Pour terminer HTTP/2 et lire le trafic sur HAProxy, vous aurez besoin de HAProxy 1.8.

32
mikemaccana

Ce qui suit devrait fonctionner sur votre équilibreur de charge si vous pouvez exécuter un NginX avec HaProxy. NginX est (ab) utilisé comme un terminateur SSL pur, pas comme un serveur Web complet, donc aucun contenu n'est servi par ce NginX.

Attention: Cela a été fait à la hâte, donc rien n'est vérifié que cela fonctionne vraiment. Certains exemples manquent, désolé pour les liens.

J'appelle cette idée d'après la célèbre image de Munchhausen, tirant lui-même et le cheval hors d'une boue :

La méthode Munchhausen

Tout d'abord, faites une configuration H2 dans HaProxy comme dans la réponse de Scott Farrell avec les ajustements suivants:

frontend http-in
    mode http
    bind *:80
    option forwardfor
    default_backend nodes-http

frontend https-in
    mode tcp
    bind *:443 ssl crt /etc/ssl/dummy.pem alpn h2,http/1.1
    use_backend nodes-http2 if { ssl_fc_alpn -i h2 }
    default_backend nodes-http

frontend http-lo
    mode http
    bind 127.0.0.1:82
    #http-request set-header X-Forwarded-For req.hdr_ip([X-Forwarded-For])
    default_backend nodes-http

backend nodes-http
    mode http
    server node1 web.server:80 check

backend nodes-http2
    mode tcp
    server loadbalancer 127.0.0.1:81 check send-proxy

Cela boucle le HTTP/2 reconnectez-vous à votre machine d'équilibrage de charge et acceptez les demandes décodées pour entrer à nouveau l'équilibrage de charge via http-lo.

Maintenant sur le LB lui-même, lancez NginX pour écouter sur le port 81 comme dans l'instance de configuration pour terminer le HTTP/2 connexion et proxy à nouveau vers votre équilibreur de charge.

Dans NginX, assurez-vous de:

  • Utilisez send-proxy-protocol dans NginX

  • Mettez fin au SSL à l'aide de HTTP/2 dans NginX

  • Procurez-vous tout en toute transparence (aka. Dumb) sur HaProxy port 82

    # Sorry, example `NginX`-config is missing here,
    # but it includes something like:
    proxy_pass http://127.0.0.1:82;
    
  • N'oubliez pas d'inclure le Client-IP via X-Forwarded-For en-tête dans la requête proxy (je ne sais pas comment configurer NginX pour utiliser le protocole "Send Proxy" sur les requêtes proxy sortantes).

Notez que cette configuration est principalement statique. La partie changeante concerne tous ces domaines et leurs certificats TLS.

Image ASCII de HTTP/2 flux de demande

     Browser
        |  HTTP/2
        V
     Loadbalancer HaProxy *:443
        |  frontend https-in
        |  backend nodes-http2
        |  send-proxy
        |  TCP (transparent, HTTP/2)
        V
     Loadbalancer NginX 127.0.0.1:81 
        |  HTTP/2 termination
        |  proxy_protocol
        |  proxy_pass 127.0.0.1:82
        |  Add header X-Forwarded-For
        |  HTTP
        V
     Loadbalancer HaProxy 127.0.0.1:82
        |  frontend https-lo
        |  Forward Header X-Forwarded-For
        |  backend nodes-http
        |  # DO YOUR LOADBALANCING HERE
        |  HTTP
        V
      web.server:80

Oui, il boucle 2 fois à travers HaProxy, mais grâce à la rapidité avec laquelle HaProxy fonctionne, cela fonctionne très vite.

La vraie partie inefficace est quand il s'agit de décompresser le HTTP/2 en-têtes en plain HTTP en-têtes ..

1
Tino

haproxy ne prend pas encore vraiment en charge http/2

Le seul support dont il dispose est de détecter une demande http/2 et de transmettre le flux TCP https/tcp443 à un serveur qui prend en charge https et http/2.

voici le guide de quelqu'un d'autre http://m12.io/blog/http-2-with-haproxy-and-nginx-guide

1
Scott Farrell