Имя домена 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)]
Другие вопросы по тегам