Я использую haproxy в режиме tcp. У меня один интерфейс, который прослушивает несколько портов:
frontend front
mode tcp
bind *:20000
bind *:20001
...
default_backend back
И единственный бэкэнд, который пересылает эти запросы без изменения портов:
backend back
server myserver server.host.com check port 20000
server anotherServer another.host.com check port 20000
server mybackup backup.host backup.host.com check port 20000 backup
# some other useful backend logic, like logging
# which I don't want to repeat a bunch of times
Поскольку мы поддерживаем некоторые устаревшие API, нам необходимо принять некоторые старые порты более низкого уровня и переназначить их. Например, я хочу принять порт 200
и переназначить его на 20000
, 201
к 20001
, и т.д.
Я надеялся, что директива внешнего интерфейса изменит порт, как вы могли бы сделать для заголовка в режиме http, но я не могу его найти. Придется ли отказаться от моего красивого чистого одиночного бэкенда?
На вашем месте я бы использовал 2 бэкенда.
Если вы настаиваете, вы можете использовать use-server <server> if <condition>
вариант и тест dst_port
.
Что-то вроде: use-server bla20001 if dst_port 201
или что-то вроде этого.
Я считаю, что нет хорошего способа сделать это. В итоге я создал больше интерфейсов и бэкэндов.