wake-up-neo.com

Wie kann ich HTTP / 2 auf HAProxy aktivieren?

Wir haben kürzlich von HTTP zu HTTPS gewechselt. Da wir bereits zu HTTPS gewechselt sind, denken wir darüber nach, zu HTTP/2 zu wechseln, um Leistungsvorteile zu erzielen.

enter image description here

Wie oben erläutert, werden Anforderungen zwischen Browser und LB gesichert (HTTPS), während die Kommunikation zwischen LB und App-Server weiterhin über HTTP erfolgt

Welche Möglichkeit besteht, HTTP/2 mit dem aktuellen Setup zu aktivieren? Können wir HTTP/2 zwischen Browser und LB aktivieren, während die Kommunikation zwischen LB und App-Servern bestehen bleibt auf HTTP?

17
ssharma

HAProxy 1.8 unterstützt HTTP/2

Von die 1.8 Ansage :

HAProxy 1.8 unterstützt jetzt HTTP/2 auf der Clientseite (in den Frontend-Abschnitten) und kann als Gateway zwischen HTTP/2-Clients und Ihren HTTP/1.1- und HTTP/1.0-Anwendungen fungieren.

Du brauchst das h2 Direktive in Ihrem haproxy.conf. Von CertSimple's HAProxy HTTP/2 und Dynamic Load Balancing Guide:

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

Ältere Versionen von HAProxy

Ältere Versionen von HAProxy wie 1.6 und 1.7 unterstützen nur Pass-Through-HTTP/2, dh, sie leiten den Datenverkehr auf einen separaten App-Server, der HTTP/2 unterstützt. Dies ist erheblich komplizierter - siehe andere Antworten dazu. Um HTTP/2 zu beenden und den Datenverkehr auf HAProxy zu lesen, benötigen Sie HAProxy 1.8.

32
mikemaccana

Das Folgende sollte auf Ihrem Load Balancer funktionieren, wenn Sie in der Lage sind, einige NginX zusammen mit HaProxy auszuführen. NginX wird (ab) als reiner SSL-Terminator und nicht als vollwertiger Webserver verwendet, sodass von diesem NginX kein Inhalt bereitgestellt wird.

Warnung: Dies wurde in Eile durchgeführt, daher wird nicht überprüft, ob dies wirklich funktioniert. Einige Beispiele fehlen, also entschuldigen Sie die Links.

Ich nenne diese Idee nach dem berühmten Bild von Münchhausen, der sich und das Pferd aus dem Sumpf zieht :

Die Münchhausen-Methode

Zuerst H2-Setup in HaProxy wie in der Antwort von Scott Farrell mit folgenden Änderungen:

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

Dadurch wird die HTTP/2 - Verbindung zu Ihrem Loadbalancer-Rechner zurückgeschleift und die dekodierten Anforderungen zur erneuten Eingabe des Loadbalancing über http-lo Akzeptiert.

Starten Sie nun auf dem LB selbst NginX, um den Port 81 Wie in der Konfigurationsinstanz abzuhören, um die HTTP/2 - Verbindung zu beenden und ihn erneut an Ihren Loadbalancer zu übertragen.

Stellen Sie in NginX Folgendes sicher:

  • Verwenden Sie send-proxy-protocol in NginX

  • Beende das SSL mit HTTP/2 In NginX

  • Proxy alles transparent (aka. Dumm) zurück zu HaProxy port 82

    # Sorry, example `NginX`-config is missing here,
    # but it includes something like:
    proxy_pass http://127.0.0.1:82;
    
  • Vergessen Sie nicht, die Client-IP über den X-Forwarded-For - Header in die Proxy-Anfrage aufzunehmen (ich kann NginX nicht so konfigurieren, dass das "Send Proxy" -Protokoll für ausgehende Proxy-Anfragen verwendet wird).

Beachten Sie, dass dieses Setup überwiegend statisch ist. Der sich ändernde Teil handelt von all diesen Domänen und ihren TLS-Zertifikaten.

ASCII-Bild des Anforderungsflusses HTTP/2

     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

Ja, es wird zweimal durch HaProxy geschleift, aber dank der Schnelligkeit von HaProxy funktioniert dies blitzschnell.

Der wirkliche ineffiziente Teil ist, wenn es darum geht, die HTTP/2 - Header in einfache HTTP Header zu dekomprimieren.

1
Tino

haproxy unterstützt http/2 noch nicht wirklich

Die einzige Unterstützung besteht darin, eine http/2-Anforderung zu erkennen und den https/tcp443-tcp-Stream an einen Server zu übergeben, der https und http/2 unterstützt

hier ist jemand anderes Leitfaden http://m12.io/blog/http-2-with-haproxy-and-nginx-guide

1
Scott Farrell