У меня есть установка с HaProxy, где каждый haproxy-сервер направляет трафик на несколько серверов приложений. Маршрутизация для обычного HTTP-трафика основана на хеш-коде URL-адреса запроса.
Теперь я хочу создать некоторые правила, позволяющие направлять определенные административные запросы на определенные серверы приложений. То есть у меня есть серверы приложений «node06 - node15». Я хотел бы иметь возможность запросить node06.mydomain.com/my-admin-request и перенаправить его на правильный сервер приложений.
Я не могу сделать это через DNS. Все запросы поступают через один открытый IP-адрес в кластер.
Итак, я создал конфигурацию haproxy, которая делает то, что я хочу:
frontend www-http
bind :80
reqadd X-Forwarded-Proto:\ http
acl node06 hdr_beg(host) -i node06.
use_backend node06-status if node06
acl node07 hdr_beg(host) -i node07.
use_backend node07-status if node07
# ... and many more such nodes ...
default_backend application-backend
# This is the application back end.
# Route request based on hash of url
backend application-backend
balance url_param url check_post
server node06 192.168.1.70:80 check
server node07 192.168.1.71:80 check
# ... and many more such nodes ...
# these are the status back ends. This is so we can make requests
# direct to each node for the status console.
backend node06-status
server node06 192.168.1.70:80
backend node07-status
server node07 192.168.1.71:80
# ... and many more such back ends ...
Это будет работать (я думаю), но это действительно многословно. Мне нужно трижды создать идентичные блоки конфигураций для каждого сервера приложений в кластере. Это станет неуправляемым, если я расширю это за пределы 10 узлов.
Есть ли способ настроить это так, чтобы мне не приходилось разделять строки конфигурации для каждого сервера приложений?
Вы можете поместить ACL и use-server (а не use-backend) в определение бэкэнда. Также, я думаю, что вы можете использовать встроенные ACL и не обязательно определять их перед использованием.
.