Настройка Haproxy с настройкой поддоменов

8

Надеясь, кто-то может помочь подтвердить, если это должно работать? Я пытаюсь направить трафик 3 субдоменов к одному и тому же хосту haproxy;

Вот моя установка

haproxy с одним интерфейсом ip 10.10.10.100 и днс имя haproxy01.mydomain.com

3 записи CNAME, связанные с ним; sub1.mydomain.com, sub2.mydomain.com и sub3.mydomain.com

весь входящий трафик для порта 443.

Есть два серверных сервера приложений, которые принимают трафик на трех портах 8081, 8082, 8083, скажем так;

sub1.mydomain.com для 8081 sub2.mydomain.com для 8082 и sub3.mydomain.com для 8083

Приложению требуется проход SSL только для трафика порта 8081, поэтому я считаю, что для него я должен использовать режим tcp, другой трафик для 8082 и 8083 также SSL, но его можно завершить в Haproxy, но для тестирования я прошел со всеми TCP Режим.

Мой раздел конфигурации для достижения этого ниже;

    #Application Setup 
frontend mytraffic
    bind *:443
    mode  tcp
    acl host_sub1 hdr(host) -i sub1.mydomain.com
    acl host_sub2 hdr(host) -i sub2.mydomain.com
    acl host_sub3 hdr(host) -i sub3.mydomain.com

    use_backend sub1_nodes if host_sub1
    use_backend sub2_nodes if host_sub2
    use_backend sub3_nodes if host_sub3

    option tcplog backend sub1_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8081 check
    server node2 10.10.10.102:8081 check 
backend sub2_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8082 check
    server node2 10.10.10.102:8082 check 
backend sub3_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8083 check
    server node2 10.10.10.102:8083 check


    # APPLICATION SETUP END

Когда я пытаюсь получить доступ к серверам приложений через HAproxy, например, для трафика 8082, он выдает это журналы;

localhost haproxy [6097]: xxxx: 51241 [20 / Mar / 2015: 12: 19: 38.720] mytraffic mytraffic / -1 / -1 / 0 0 SC 0/0/0/0/0 0/0

цените некоторое руководство относительно этой установки.

PS Я не могу вставить изображение для ясности, так как это мой первый пост :-(

Глобальное обучение
источник
сообщение журнала не было завершено; 20 марта 12:19:38 локальный haproxy [6097]: xxxx: 51241 [20 / Mar / 2015: 12: 19: 38.720] mytraffic mytraffic / <NOSRV> -1 / -1 / 0 0 SC 0/0/0 / 0/0 0/0
Глобальное обучение
NOSRV означает, что он не может найти подходящий бэкэнд. Можете ли вы получить доступ к странице статистики или сокету и посмотреть, какие бэкенды HAproxy считает работоспособными?
Джим Г.
Также проверьте, есть ли связь между haproxy и серверами приложений. При использовании nc: nc -v 10.10.10.101 8081, nc -v 10.10.10.102 8081 и т. Д.
hdanniel
Последняя проверка на панели мониторинга haproxy сообщает обо всех узлах. Я также подтвердил подключение от консоли Haproxy к этим серверам приложений на всех портах.
Глобальное обучение
@HD да, связь на обоих узлах в порядке.
Глобальное обучение

Ответы:

11

В режиме TCP HAProxy не будет декодировать HTTP-запрос, поэтому ваши aclстроки ничего не будут делать, и веб-интерфейс никогда не сможет соответствовать внутреннему интерфейсу, как показывают введенные вами журналы: mytraffic/<NOSRV>означает, что он не смог выбрать бэкэнд или сервер.

Вам придется разделить 3 субдомена на 2 разных внешних интерфейса, каждый со своими IP-адресами, так как все они подключаются через порт 443. Один для сквозного доступа, другой для завершения SSL и переключения контента с использованием mode http. Предостережение заключается в том, что если вы добавите 4-й поддомен (sub4.mydomain.com), который также требует переадресации, вам потребуется третий интерфейс и IP-адрес.

Вам также необходимо создать разные записи CNAME или A в DNS, чтобы правильные субдомены указывали на правильные IP-адреса.

Учитывая эту конфигурацию DNS:

10.10.10.100        A         haproxy01-cs.mydomain.com
10.10.10.101        A         haproxy01-pt1.mydomain.com
10.10.10.102        A         haproxy01-pt2.mydomain.com
sub1.mydomain.com   CNAME     haproxy01-pt1.mydomain.com
sub2.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub3.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub4.mydomain.com   CNAME     haproxy01-pt2.mydomain.com

Конфигурация HAproxy будет выглядеть примерно так:

#Application Setup 
frontend ContentSwitching

  bind 10.10.10.100:443
  mode  http
  option httplog
  acl host_sub2 hdr(host) -i sub2.mydomain.com
  acl host_sub3 hdr(host) -i sub3.mydomain.com
  use_backend sub2_nodes if host_sub2
  use_backend sub3_nodes if host_sub3

frontend PassThrough1
  bind 10.10.10.101:443
  mode  tcp
  option tcplog
  use_backend sub1_nodes     

frontend PassThrough2
  bind 10.10.10.102:443
  mode  tcp
  option tcplog
  use_backend sub4_nodes

backend sub1_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8081 check
  server node2 10.10.10.102:8081 check 

backend sub2_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8082 check
  server node2 10.10.10.102:8082 check 

backend sub3_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8083 check
  server node2 10.10.10.102:8083 check

backend sub4_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8084 check
  server node2 10.10.10.102:8084 check
GregL
источник
На самом деле, IP-адреса, которые я здесь имею, не имеют никакого смысла (я использовал 10.10.10.101-102 для внешних интерфейсов, в которых они были назначены узлам), но вы понимаете, как это будет выглядеть.
Грегл
@GreL - СПАСИБО. Я собираюсь попробовать это и обведено результатами. Я беспокоился о режиме tcp и использовании acl перед его использованием.
Глобальное обучение
Спасибо Грегл. оно работает. Последний вопрос, если можно? чтобы иметь SSL от клиента -> haproxy и к haproxy -> бэкэнд-серверу (как он может завершить, но запустить новый для бэкэнда), каков рекомендуемый способ сделать это? SSL пройти через режим TCP? Причина, по которой я хотел выполнить транзит для трафика порта 8081, заключается в требовании взаимно аутентифицируемого сеанса с приложением и клиентом. Остальной трафик портов 8082 и 8083 требует ssl, но не требует взаимной аутентификации. (сейчас я пошел с сквозным подходом).
Глобальное обучение
Ну, HAProxy может сделать проверку сертификата клиента, используя ca-fileи verify optionalопции к bindзаявлению. Если вы это сделаете, вы можете привязать один интерфейс к одному IP, а затем переключить контент на соответствующие серверы, как того требует заголовок узла . Чтобы подтвердить, что взаимная аутентификация работала, вы можете создать ACL-подобие acl ClientSSLValid ssl_c_verify 0, а затем добавить его в качестве еще одного условия к use_backendутверждению вродеuse_backend sub1_nodes if host_sub1 ClientSSLValid
GregL
Там же приличные рецензии здесь и здесь о том , как это сделать, с более подробно , чем я обеспечил.
Грегл