HAProxy доменное имя для отображения бэкэнда для маршрутизации на основе пути(url)

поддерживает ли HAProxy доменное имя для отображения бэкэнда для маршрутизации на основе пути.

в настоящее время он поддерживает карты для vhost:

frontend xyz
   <other_lines>
   use_backend backend1 if { hdr(Host) -i myapp.domain1.com }
   use_backend backend2 if { hdr(Host) -i myapp.domain2.com }

можно переписать с помощью карт как:

frontend xyz
   <other_lines>
   use_backend %[req.hdr(host),lower,map_dom(/path/to/map,default)]

с содержимым файла карты как:

#domainname  backendname
myapp.domain1.com backend1
myapp.domain2.com backend2

но если маршрутизация основана на путях, как показано в примере ниже:

frontend xyz
   acl host_server_myapp hdr(host) -i myapp.domain.com
   acl path_path1 path_beg /path1
   acl path_path2 path_beg /path2
   use_backend backend1 if host_server_myapp path_path1
   use_backend backend2 if host_server_myapp path_path2

возможно ли иметь отображение для этого usecase? Используя base вместо hdr (хост) может дать весь путь, но он не будет иметь гибкости доменов, так как base сравнение строк. Есть ли другой способ преобразовать это в HAProxy maps.

1 ответов


С слой 7 base fetch --

это возвращает конкатенацию первого заголовка Хоста и части пути запрос, который начинается с первой косой черты и заканчивается перед вопросом отметка.

...тогда используйте map_beg() для сопоставления начала строки с картой.

use_backend %[base,map_beg(/etc/haproxy/testmap.map,default)]

если файл карты /etc/haproxy/testmap.map имеет строку, соответствующую префиксу, используется бэкэнд в файле карты. В противном случае бэкэнд вызвал default будет использован (это 2-й аргумент map_beg() -- значение, которое будет возвращено, если карта не соответствует).

если результирующий сервер фактически не существует, HAProxy продолжает обработку запроса, как если бы этот оператор не был настроен вообще.

так что ваш файл будет выглядеть примерно так:

example.com/foo     this-backend # note, also matches /foo/ba 
example.com/foo/bar that-backend # note, matches /foo/bar
example.org/foo     some-other-backend

для обработки поддомена как эквивалента родительского домена (например, обработка example.com и www.example.com для обработки эквивалентно, без дублирования карты, как обсуждается в комментариях)regsub() конвертер может использоваться для изменения значения, переданного на карту:

use_backend %[base,regsub(^www\.,,i),map_beg(/etc/haproxy/testmap.map,default)]