Добрый день всем,
Я новичок в веб-хостинге и все еще чувствую, что учусь плавать посреди океана. Я хочу настроить HAproxy для пересылки запроса на удаленный сервер в бэкэнде. Этот сервер SSL и за Cloudflare.
Я обыскал весь интернет, но до сих пор не могу найти прямого и ясного ответа на свой вопрос. Я вытащил образ haproxy и использую его в контейнере с внешним файлом haproxy.cfg. Никто не поясняет, можно ли использовать в качестве сервера в бэкэнде сервер вне вашей сети (не локальный) и, более того, как использовать SSL для этой связи. Если кто-то из вас знает об этом, я был бы признателен за ответ, возможно ли это и как.
Я сейчас использую на сервере контейнер NginxProxyManager и изучаю возможности балансировки нагрузки HAProxy. До сих пор я успешно обходил локальные контейнеры, но с удаленными серверами я всегда получаю ответ в статистике «Down for Maintenance». Я также запустил в терминале в контейнере ha-proxy команду wget, и она может видеть внешний мир. Если я пингую изнутри контейнера HAProxy Google, он пингует его. Все контейнеры подключены как к сети моста, так и к сети, созданной пользователем (драйвер моста) в docker. Вот почему я полностью запутался. Итак, главный вопрос: можно ли это сделать, и если возможно, возможен ли следующий сценарий (?):
- Клиент делает https-запрос к HAProxy
- С помощью roundrobin я (хотел бы) переключаться между локальными контейнерами и удаленными серверами
- Когда я доберусь до раунда «удалённого сервера», я хотел бы отправить с бэкэнда правильный хост сервера (переписанный — я уже могу это сделать, но для локальных контейнеров) вместе с информацией о том, что это запрос SSL.
- Затем NginxProxyManager или другой HAProxy перенаправит его в подключенный там контейнер, получит ответ и отправит его обратно (первому) HAProxy, а последний — клиенту.
Я даже не уверен, возможно ли это. Посмотрите на следующее. Это работает с локальными контейнерами, но не с удаленным сервером. Он отправляет запрос и переписывает имя заголовка Host. Вот haproxy.cfg
global
maxconn 4000
daemon
defaults
mode http
default-server init-addr last,libc,none
option http-keep-alive
option redispatch
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
option forwardfor
resolvers mynameservers
nameserver ns2 8.8.8.8:853
frontend stats
bind *:8500
stats enable
stats uri /
stats refresh 10s
frontend ft
bind 0.0.0.0:443 ssl crt /usr/local/etc/haproxy/ha_trial.pem
default_backend bt2
backend bt2
balance roundrobin
http-send-name-header Host
server web1 web1:8080 check
server web2 web2:8080 check
server web3 web3:8080 check
server myback.mysite.com myback.mysite.com:443 ssl verify none resolvers mynameservers
## the latter does not work - it ends at down for maintenance in statistics and in logs it says: Layer6 invalid response, info: "SSL handshake failure" while it is "verify none"
Если вы можете помочь мне с ответом, если вы его знаете, и/или с какими-то ссылками, все люди, такие как я, и особенно я, были бы вам очень признательны.
Спасибо
решение1
Случай как раз и есть случай сбоя SSL Handshake, потому что образ докера HAProxy не поддерживает QUIC, а бэкенд находится за Cloudflare, который по умолчанию поддерживает QUIC. Если я использую другой домен, который не поддерживает QUIC в протоколе связи https, все работает как часы. Мне также интересно, почему, черт возьми, он обрабатывает фронтенд и бэкенд по-разному??? Во фронтенде он понимает QUIC (? - или это QUIC между вами и cloudflare, а между cloudflare и сервером разное шифрование?), но подключение из бэкенда невозможно?
Итак, вкратце:
- Образ докера HAProxy не поддерживает QUIC - по крайней мере тот, что у меня есть (Alpine)
- Cloudflare по умолчанию активировал QUIC в качестве протокола связи для своих продуктов, и вы не можете изменить его.
- Сотрудничество этих двух факторов, очевидно, невозможно, и это бросает вам в лицо «Ошибку установления связи SSL».
- Чтобы исправить это, воспользуйтесь услугами провайдера, который не поддерживает новейшие протоколы связи. На данный момент это всего лишь способ смягчения проблемы, а не решение.
- Сайт HAProxy предоставляет способ перекомпиляции HAProxy из github с поддержкой QUIC, и я изучу этот вопрос позже...