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

Настройте HAProxy для включения заголовков хостов для разных бэкэндов

Я изучаю возможность использования HAProxy в качестве балансировщика перед набором веб-API, работающих на IIS.

В настоящее время мы используем заголовки узла, чтобы правильно разрешить правильное веб-приложение в IIS. Например, у нас может быть otherapp.mycompany.com, работающий на том же сервере / порту, но при использовании заголовков хоста IIS знает, какой из них обслуживать.

Моя первоначальная попытка HAProxy оставила у меня ошибку 404, потому что я не включал заголовки хоста в свой запрос, и поэтому IIS обслуживал сайт по умолчанию, привязанный к данному IP, и не разрешал по имени хоста.

Исправление оставило мне что-то вроде этого:

frontend localnodes
    bind *:80
    mode http
    default_backend nodes

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80

Это отлично работает для одного бэкэнда, но я остаюсь ломать голову над тем, как включить правильные заголовки хоста в зависимости от того, какой бэкэнд обслуживает запрос:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80

Вышеуказанное не работает, когда node2 используется, потому что он не разрешается правильно в IIS (node2 в этом случае находится на другом сервере и, следовательно, с другим IP-адресом. Фактически, если бы они работали на одном сервере / IP, я подозреваю, что запрос работает "работает", но все они будут обслуживаться node1 согласно заголовку хоста).

Изменить: я использую HA-Proxy версии 1.7.9 2017/08/18

Позвольте мне рассказать об этом еще немного. Раньше у нас было только myapp.mycompany.com обслуживание запросов api. Нам нужно его расширить. Наши клиенты по-прежнему будут звонить myapp.mycompany.com, но это будет просто указывать на HAProxy, который уравновесит его до node1.myapp.mycompany.com и node2.myapp.mycompany.com. В наших текущих конфигурациях серверов мы привязываем один IP-адрес к каждому серверу, поэтому для разрешения мы используем заголовки узлов.

Я не уверен, что следующее будет работать, и не могу сейчас проверить, но, возможно, это все еще полезно. (Я посмотрю позже еще раз):

Решение 1:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-request set-header Host node1.myapp.mycompany.com if { srv_id 1 }
    http-request set-header Host node2.myapp.mycompany.com if { srv_id 2 }
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80

Решение 2:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-send-name-header Host
    server node1.myapp.mycompany.com node1.myapp.mycompany.com:80
    server node1.myapp.mycompany.com node2.myapp.mycompany.com:80

Хочу дополнить gf_ ответ. Идея его ответа - добавить пользовательский Заголовок хоста значение которого является исходным именем хоста. В первом решении он, по сути, установил заголовок вручную с условием из srv_id вещь.

Второй - ярлык для первого решения, отправив имя хоста как Заголовок хоста.

Но в своем решении он не упоминает, что это только set-header, если заголовок уже существует, он не может заменить существующий заголовок, поэтому, если в вашем случае необходимо заменить Заголовок хоста, вы можете сделать что-то вроде этого

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-request replace-header Host node1.myapp.mycompany.com node1.myapp.mycompany.com if { srv_id 1 }
    http-request replace-header Host node2.myapp.mycompany.com node2.myapp.mycompany.com if { srv_id 2 }
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80