Имя домена 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
Возможно ли иметь отображение для этого варианта использования? С помощью base
вместо hdr(хост) может дать полный путь, но он не будет иметь гибкости доменов, так как base
это сравнение строк. Есть ли другой способ конвертировать это в карты haproxy.
1 ответ
Начните со слоя 7 base
получить -
Это возвращает конкатенацию первого заголовка узла и части пути запроса, которая начинается с первой косой черты и заканчивается перед знаком вопроса.
... тогда используйте map_beg()
чтобы сопоставить начало строки с картой.
use_backend %[base,map_beg(/etc/haproxy/testmap.map,default)]
Если файл карты /etc/haproxy/testmap.map
имеет строку, соответствующую префиксу, используется бэкэнд в файле карты. В противном случае бэкэнд называется default
будет использоваться (это второй аргумент 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)]