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)]