Использование HAproxy для прокси-запросов h2c - PullRequest
0 голосов
/ 01 февраля 2019

Можно ли использовать HAproxy для прокси-сервера входящих h2c-запросов?

Я пробовал следующую конфигурацию , используя это руководство :

frontend receiver
  mode http
  bind *:80
  bind *:443 ssl crt-list /some/file alpn h2,h2c,http/1.1
  default_backend processor

Эта конфигурация работает дляh2 (безопасный HTTP / 2) запрашивает и отправляет запросы HTTP / 1.1 на сервер.Однако это не работает для запросов h2c (HTTP / 2 в виде открытого текста), сделанных с помощью curl.Я получаю следующее сообщение об ошибке:

$ curl --http2-prior-knowledge http://server.com/status
...
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle ...)
> GET /status HTTP/2
...
* http2 error: Remote peer returned unexpected data while we expected SETTINGS frame.  Perhaps, peer does not support HTTP/2 properly.
...
curl: (16) Error in the HTTP2 framing layer

Я подозреваю, что это связано с тем, что HAProxy ожидает данные h2 (вместо h2c) в ответе.Любое предложение о том, что мне нужно изменить в конфигурации HAProxy для поддержки входящих запросов h2c?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

На основе обсуждения в канале HAproxy можно прокси-запросы h2c, используя параметр proto h2 в bind.Однако в настоящее время невозможно прослушивать запросы HTTP / 1.1 и HTTP / 2 на одном и том же порту *1005*.

Пример конфигурации для получения h2c работы с HAProxy:

frontend f_h2c
    mode http
    option http-use-htx
    bind *:8080 proto h2
    default_backend local_node

backend local_node
    mode http
    option http-use-htx
    server localhost localhost:9090 proto h2
0 голосов
/ 01 февраля 2019

Можно проксировать входящие запросы в режиме tcp, если ваш сервер поддерживает h2c.Это то, что вы использовали в учебнике для запросов h2, но без причины он не будет работать и для h2c.

С тех пор как этот учебник был написан, HAProxy добавил поддержку HTTP / 2 в v1.8 , поэтому он также может прокси-запросы h2 в режиме http, но, насколько я знаю, это невозможно сделать для h2c.Документация не совсем ясна по этому вопросу, но состояние ALPN используется для согласования HTTP / 2 и этот вопрос утверждает, что поддержка h2c не была добавлена.

HAProxy 1.9 действительно добавила поддержку h2cв бэкэнде , но до сих пор не замечено, что он поддерживается во внешнем интерфейсе.

Если честно, поддержка h2c во внешнем интерфейсе часто имеет ограниченное использование, поскольку браузеры не поддерживают его, и посколькутребуется либо этап обновления, либо допущение, что сервер поддерживает его (ни один из которых не является идеальным), в отличие от h2, который может быть согласован как часть согласования TLS без дополнительных обходов или допущений.

Есть ли конкретныйПричины, по которым вы хотите получить поддержку h2c во внешнем интерфейсе, поскольку могут быть более эффективные способы достижения того, чего вы хотите.

...