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.
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?
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.
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 :
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.
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 ..
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