Я пытался настроить HAProxy для отправки трафика на разные внутренние серверы на основе имен хостов. Я пробовал использовать направления, указанные в Как перенаправить трафик на основе имени хоста с помощью HAProxy? но, к сожалению, мне не повезло.
Я пытаюсь сделать так, чтобы, если клиент переходит на bk1.domain.com:80, трафик отправляется на бэкэнд «backend1». Точно так же, если кто-то переходит на bk2.domain.com:80, трафик должен направляться на серверную часть "backend2". Весь остальной трафик следует отправлять на серверную часть "по умолчанию". Для пояснения, domain.com, bk1.domain.com, bk2.domain.com разрешаются на один и тот же IP-адрес.
К сожалению, при переходе на bk1.domain.com или bk2.domain.com для всех запросов используется бэкэнд "по умолчанию". Похоже, что HAProxy не распознает заголовки хоста и в результате не может перенаправлять запросы на соответствующий сервер.
Ниже представлен текущий файл haproxy.cfg. Любая помощь приветствуется.
global
log 127.0.0.1 local0
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
retries 3
option redispatch
maxconn 2000
timeout http-request 5s
timeout connect 5s
timeout client 30s
timeout server 10s
frontend all_clients
bind 0.0.0.0:80
acl back1 hdr(host) -i bk1.domain.com
acl back2 hdr(host) -i bk2.domian.com
use_backend backend1 if back1
use_backend backend2 if back2
default_backend default
backend default
balance roundrobin
server a1 192.168.0.1:8080
server a2 192.168.0.2:8080
server a3 192.168.0.3:8080
backend backend1
balance roundrobin
server b1 10.0.0.1:8080
server b2 10.0.0.2:8080
backend backend2
balance roundrobin
server c1 172.16.0.1:8080
server c2 172.16.0.2:8080
Старый вопрос, но ответ прост: строка bk1.example.com:80
не идентично строке bk1.example.com
. Большинство - но не все - современные клиенты удаляют номер порта из заголовка своего хоста перед его отправкой, если это порт по умолчанию для протокола.
Если клиент явно отправляет номер порта в заголовке своего хоста, вам понадобится дополнительный ACL для этого случая, если вы не хотите пойти по менее безопасному маршруту с использованием hdr_beg(Host)
.
Другими словами, правильный синтаксис, позволяющий точно поймать оба заголовка, может выглядеть примерно так:
frontend all_clients
bind 0.0.0.0:80
acl back1 hdr(Host) -i bk1.domain.com
acl back1 hdr(Host) -i bk1.domain.com:80
acl back2 hdr(Host) -i bk2.domian.com
acl back2 hdr(Host) -i bk2.domian.com:80
use_backend backend1 if back1
use_backend backend2 if back2
default_backend default
вырезал ваш код и отредактировал. что вам нужно сделать, это определить acl, а затем маршрутизировать на основе acl:
frontend all_clients
bind 0.0.0.0:80
default_backend default
acl back1 if hdr_beg(host) -i bk1.
acl back2 if hdr_beg(host) -i bk2.
use_backend bk1 if back1
use_backend bk2 if back2