Como posso activar o HTTP/2 no HAProxy?

Recentemente, passámos de HTTP para HTTPS. Como já nos mudamos para HTTPS, estamos pensando em nos mudar para HTTP/2 para obter benefícios de desempenho.

enter image description here

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?

Author: mikemaccana, 2016-11-17

3 answers

O HAProxy 1. 8 suporta o HTTP/2

De o anúncio 1.8:

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.

Vai precisar da directiva na sua. De HAProxy HTTP/2 do CertSimple e dynamic load balancing guide:
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.

 26
Author: mikemaccana, 2018-05-30 09:16:45

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-guide
 3
Author: Scott Farrell, 2016-11-18 21:52:49

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

Agora no próprio LB, comece a ouvir no Porto como na configuração. instância para terminar a ligação 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 em NginX

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

Note que esta configuração é praticamente estática. A parte em mudança é sobre todos esses domínios e seus TLS-certs.

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

 3
Author: Tino, 2017-10-27 13:24:17