Я изучаю возможность использования 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 согласно заголовку хоста).
check
s также необходимо предоставить правильный заголовок хоста на основе серверной части, как это сделать?Изменить: я использую 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