Назад | Перейти на главную страницу

HAProxy не распознает заголовки хоста?

Я пытался настроить 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