Как включить HTTP / 2 на HAProxy?



Недавно мы перешли с HTTP на HTTPS. Поскольку мы уже перешли на HTTPS, мы думаем о переходе на HTTP/2, чтобы получить преимущества производительности.



Введите описание изображения здесь



Как было объяснено выше, запросы между браузером и LB защищены (HTTPS), в то время как связь между LB и сервером приложений все еще использует HTTP



Какова возможность включения HTTP / 2 при текущей настройке? можем ли мы включить HTTP / 2 между браузером и LB во время связи между LB а серверы приложений остаются на HTTP?

850   3  

3 ответов:

HAProxy 1.8 поддерживает HTTP/2

Из объявления 1.8 :

HAProxy 1.8 теперь поддерживает HTTP / 2 на стороне клиента (в разделах frontend) и может выступать в качестве шлюза между клиентами HTTP/2 и вашими приложениями HTTP/1.1 и HTTP/1.0.

Вам понадобится Директива h2 в вашем haproxy.conf. Из руководство по HAProxy HTTP/2 и динамической балансировке нагрузки CertSimple:

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

Более старые версии HAProxy

Более старые версии HAProxy, такие как 1.6 и 1.7, поддерживают только сквозной HTTP / 2-ie, направляя трафик на отдельный сервер приложений, поддерживающий HTTP / 2. Это значительно сложнее - смотрите другие ответы о том, как это сделать. Чтобы завершить HTTP / 2 и прочитать трафик на HAProxy, вам понадобится HAProxy 1.8.

Haproxy еще не поддерживает http / 2

Единственная поддержка, которую он имеет, - это обнаружение запроса http / 2 и передача потока https / tcp443 tcp серверу, который поддерживает https и http / 2

Вот чей-то путеводитель http://m12.io/blog/http-2-with-haproxy-and-nginx-guide

Следующее должно работать на вашем балансировщике нагрузки, если вы можете запустить некоторые NginX наряду с HaProxy. NginX is (ab)используется как чистый Терминатор SSL, а не как полнофункциональный веб-сервер, поэтому никакой контент не обслуживается этим NginX.

Предупреждение: Это было сделано в спешке, поэтому ничто не подтверждает, что это действительно работает. Некоторые примеры отсутствуют, поэтому извините за ссылки.
Я называю эту идею в честь знаменитой картины Мюнхгаузена "тянущий себя и лошадь". из трясины :

Метод Мюнхгаузена

Во-первых, сделайте настройку H2 в HaProxy , как в ответе Скотта Фаррелла со следующими настройками:

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

Это закольцовывает соединение HTTP/2 обратно к вашей машине loadbalancer и принимает декодированные запросы на ввод loadbalancing снова через http-lo.

Теперь на самом LB, начните NginX слушать на порту 81 как в конфигурации экземпляр, чтобы прервать соединение HTTP/2 и прокси-сервер его обратно в опять ваш балансировщик нагрузки.

В NginX обязательно:

  • Использовать send-proxy-протокол в NginX

  • Завершите SSL, используя HTTP/2 в NginX

  • Прокси все прозрачно (ака. тупой) назад в порт HaProxy 82

    # Sorry, example `NginX`-config is missing here,
    # but it includes something like:
    proxy_pass http://127.0.0.1:82;
    
  • Не забудьте включить заголовок Client-IP via X-Forwarded-For в запрос прокси (я не знаю, как настроить NginX на использование протокола "Send Proxy" на исходящем прокси требования заказчика).

Обратите внимание, что эта настройка в основном статична. Изменение касается всех этих доменов и их TLS-сертификатов.

ASCII изображение 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

Да, он петляет 2 раза через HaProxy,но благодаря тому, как быстро работает HaProxy, это работает молниеносно.

Реальная неэффективная часть - это когда речь заходит о распаковке заголовков HTTP/2 в простые заголовки HTTP..

Comments

    Ничего не найдено.