Мое требование - иметь ~ 50 бэкэндов haproxy http, которые будут добавляться и удаляться динамически (без моего участия) в любом месте внутренней сети. Я могу предположить, что каждый HTTP-сервер знает свой IP-адрес и знает IP-адрес haproxy. Я могу предположить, что могу добавить немного кода в каждый HTTP-сервер, чтобы он мог регистрироваться в haproxy всякий раз, когда он запускается, и отменять регистрацию, прежде чем он замедлится.
У меня haproxy прослушивает порт 80:
frontend main *:80
Дополнительно выставляю статистический сокет:
stats socket 0.0.0.0:8080
Моя установка работает, и, в частности, я могу подключиться к сокету статистики, используя socat readline TCP4:<haproxyIP>:8080
Предположим, у нас есть два HTTP-сервера, обслуживающие 10.0.0.1:4040
и 10.0.0.2:4040
, и этот haproxy может подключиться к обоим адресам.
Какую команду сокета stat мне нужно выполнить через сокет stat, чтобы любой запрос <haproxyIP>:8080/backend1/status
направляется к 10.0.0.1:4040/status
и любой запрос <haproxyIP>:8080/backend2/version
направляется к 10.0.0.2:4040/version
?
В общем: как мне динамически проксировать HTTP-запросы от [GET|POST] <haproxyIP>:<haproxyPort>/<backendID>/<remainingPath>
к [GET|POST] <backendIP>:<backendPort>/<remainingPath>
учитывая, что я знаю карту из backendID -> backendIP, backendPort
.
Если все ваши запросы, поступающие на этот интерфейс, имеют такую форму:
frontend main
bind *:80 # Use separate bind directives as they are supported by new HAProxy versions
use_backend %[path,fields(2,/)]
backend backend1
reqrep ^([^\ :]*)\ /backend1/(.*) \1\ /\2
server foo ...
backend backend2
reqrep ^([^\ :]*)\ /backend2/(.*) \1\ /\2
server bar ...
Если у вас есть запросы, которые не в этом формате, вы можете добавить больше use_backend-s или default_backend. У вас также может быть инструмент оркестрации, который генерирует конфигурацию, сгенерировать плоский файл со всеми именами бэкэнда, и вы можете затем использовать его для еще большей логики.
acl existing_backends path -f all_backends.txt -m beg
Где all_backends.txt будет выглядеть так:
/backend1/
/backend2/
...
В зависимости от конкретной версии HAProxy, которую вы используете, это может быть несколько оптимизировано (с использованием кавычек, переменных и т. Д.), Но таким образом оно должно работать с 1.5+.
вы можете добиться этого с помощью команд сокета unix. Взгляните на пункт 9.2 management.txt doc файл.
Есть сторонние инструменты, которые используют этот api, например haproxyctl, но у меня нет опыта работы с ними.