У меня очень специфическая c бизнес-потребность, которая требует, чтобы встроенное устройство выполняло начальный HTTP-запрос и получало HTTP-ответ через HA Proxy перед набором настраиваемых внутренних серверов. Затем на том же сокете, который он установил через прокси-сервер HA, обменивайтесь данными по пользовательскому протоколу TCP до конца срока службы сокета (который обычно длится несколько дней).
Сначала я подумал, что Параметр -tunnel на прокси-сервере HA идеально подходит для этого, хотя он устарел. В частности, в нем говорится:
Option "http-tunnel" disables any HTTP processing past the first request and
the first response. This is the mode which was used by default in versions
1.0 to 1.5-dev21. It is the mode with the lowest processing overhead, which
is normally not needed anymore unless in very specific cases such as when
using an in-house protocol that looks like HTTP but is not compatible, or
just to log one request per client in order to reduce log size. Note that
everything which works at the HTTP level, including header parsing/addition,
cookie processing or content switching will only work for the first request
and will be ignored after the first response.
Итак, я попытался настроить свой прокси-сервер высокой доступности для использования режима http-туннеля. Вот упрощенная конфигурация, которую я пробовал:
frontend _front_http
mode http
bind :80
option httplog
option http-tunnel
use_backend default_sleep-server_8080
default_backend _error404
backend default_sleep-server_8080
mode http
option forwardfor
option http-tunnel
http-response set-header Strict-Transport-Security "max-age=15768000"
server srv001 10.244.0.80:8080 weight 1 check inter 2s
server srv002 10.244.0.81:8080 weight 1 check inter 2s
server srv003 10.244.0.82:8080 weight 1 check inter 2s
defaults
log global
maxconn 2000
option redispatch
option dontlognull
option http-server-close
option http-keep-alive
timeout client 50s
timeout client-fin 50s
timeout connect 5s
timeout http-keep-alive 1m
timeout http-request 5s
timeout queue 5s
timeout server 50s
timeout server-fin 50s
timeout tunnel 1h
no option http-server-close
Я также играл с включенным только http-tunnel
для интерфейса или для серверной части.
Любой метод, который я пробовал, я встречал та же проблема. Первоначальный HTTP-запрос / ответ работает так, как задумано (т. Е. Попадает в интерфейс HA Proxy, перенаправляется на бэкэнд, бэкэнд формирует ответ, который отправляется клиенту, сокет остается открытым). Но для последующих пакетов, которые мой клиент отправляет через существующий сокет, эти пакеты go непосредственно на HTTP-сервер, но никогда не пересылаются на внутренний сервер. Я проверил это с помощью TCP Dump - все, что я вижу, - это TCP-пакеты, попадающие на внешний порт, никогда не было никакого ответа, отправленного обратно клиенту, или пересылки этих пакетов в другое место.
Что-то не так с моим http установка туннеля? Или я здесь совершенно не то использую? Я знаю, что, вероятно, есть другие инструменты, которые могут достичь этого лучше, но для целей, связанных с доменом c, было бы здорово иметь возможность использовать прокси HA.