Como posso activar o HTTP/2 no HAProxy?
tal como explicado acima, os pedidos entre o navegador e o LB são seguros (HTTPS) enquanto a comunicação entre o lb e o servidor de aplicações ainda utiliza o HTTP
Qual é a possibilidade de ativar o HTTP / 2 com a configuração atual? Podemos activar o HTTP / 2 entre o navegador e o LB enquanto a comunicação entre Os servidores de LB e app permanecem em HTTP?
3 answers
O HAProxy 1. 8 suporta o HTTP/2
De o anúncio 1.8:
Vai precisar da directiva na sua. De HAProxy HTTP/2 do CertSimple e dynamic load balancing guide:O HAProxy 1.8 suporta agora o HTTP/2 do lado do cliente (nas secções frontend) e pode actuar como uma 'gateway' entre os clientes HTTP/2 e as suas aplicações HTTP/1.1 e HTTP / 1.0.
frontend myapp
bind :443 ssl crt /path/to/cert.crt alpn h2,http/1.1
mode http
Versões mais antigas de HAProxy
As versões mais antigas do HAProxy como 1.6 e 1.7 só suportam a passagem por HTTP / 2-ie, direccionando o tráfego para um servidor de app separado que suporta HTTP/2. Isto é significativamente mais complicado-veja outras respostas sobre como fazer isso. Para terminar HTTP / 2 e ler o tráfego em HAProxy, você vai precisar HAProxy 1.8.
O Haproxy ainda não suporta o http/2
O único suporte que tem, é detectar uma solicitação http/2, e passar a transmissão https / tcp443 tcp para um servidor que suporta https e http / 2
Aqui está o Guia de outra pessoa. http://m12.io/blog/http-2-with-haproxy-and-nginx-guideA seguir deve trabalhar no balancer de carga se for capaz de executar alguns NginX
ao lado de HaProxy
. NginX
is (ab) used as a pure SSL terminator, not as a full featured web server, so no content is served by this NginX
.
Aviso: isto foi feito à pressa, por isso nada se verifica que isto realmente funcione. Faltam alguns exemplos, peço desculpa pelos links.Chamo a esta ideia a imagem famosa de Munchhausen, a puxar-se a si próprio e ao cavalo fora de um mire:
O Método De Munchhausen
Primeiro, fazer um H2 instalação em HaProxy, como na resposta de Scott Farrell, com os seguintes ajustes:
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
Isto coloca a ligação HTTP/2
de volta à sua máquina de balanceamento de carga e aceita os pedidos descodificados para voltar a introduzir o balanceamento de carga através de http-lo
.
HTTP/2
e substituí-la de volta ao teu "loadbalancer" outra vez.
Em NginX certifique-se de que:
Utilizar O Protocolo 'send-proxy' na NginX
Terminar o SSL usando
HTTP/2
emNginX
-
Proxy tudo de forma transparente (também conhecido por. burro) de volta ao porto
HaProxy
82
# Sorry, example `NginX`-config is missing here, # but it includes something like: proxy_pass http://127.0.0.1:82;
Não se esqueça de incluir o cabeçalho Cliente-IP via
X-Forwarded-For
no pedido do 'proxy' (não sei como configurar o NginX para usar o protocolo 'Send Proxy' no 'proxy' de saída solicitacao).
Imagem ASCII de HTTP/2
fluxo de pedido
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
Sim, passa duas vezes por HaProxy, mas graças à rapidez com que o HaProxy funciona isto funciona rapidamente.
A parte ineficiente é quando se trata de descomprimir os cabeçalhos HTTP/2
em cabeçalhos simples HTTP
..