Допустим, у меня есть элементы A, B и C. У меня есть два внутренних сервера: server01 и server02.
Элемент A может обрабатываться server01, элементы B и C могут обрабатываться server02. Новые элементы и серверы добавляются и удаляются, и мы программно обновляем хеш-таблицу между идентификатором элемента и внутренним сервером в файле, Redis, Memcache или аналогичном (независимо от того, что поддерживает прокси).
Могу ли я сделать фронтенд, например /items/${id}
, и иметь маршрут HAProxy к правильному внутреннему серверу, основанному на ${id}
? Итак, глядя, какой идентификатор связан с каким сервером?
Если нет, сможет ли Nginx это сделать?
Ты можешь использовать карты чтобы заставить его работать.
Это прекрасно отражено в Почта в блоге HAProxy.com. Они составляют карту на основе Host
заголовок, но было бы тривиально изменить конфигурацию для работы с URL-адресом.
Одним из дополнительных преимуществ здесь является то, что вы можете динамически добавлять и удалять записи сопоставления с помощью http-[request|response] [set-map|del-map]
ключевые слова или через сокет администратора.
Изменения внесены с помощью http-[request|response]
или через сокет, не сохраняются между перезагрузками, поэтому вы хотели бы иметь некоторый внешний процесс для одновременного обновления файла карты, но это уже другой вопрос.
Предполагая, что у вас есть бэкэнд для каждого сервера и задан файл карты с именем /etc/haproxy/items.map
с этим содержанием:
#itemPath backendname
/item/a bk_server01
/item/b bk_server02
/item/c bk_server02
Вы бы сделали что-то вроде этого в своем интерфейсе:
frontend ft_items
[...]
use_backend %[path,lower,map(/etc/haproxy/items.map,bk_default)]
Если у вас есть оба сервера в одном бэкэнде, вы должны написать ACL во внешнем интерфейсе, который улавливает все элементы (acl items path_beg /items
), отправьте их на бэкэнд (use_backend servers if items
) и замените use_backend
строка из внешнего интерфейса с соответствующим условием if use_server
строки в бэкэнде.
Да, вы легко можете сделать это с помощью HAProxy. Просто создайте ACL со списком идентификаторов, обслуживаемых сервером, и примените его к директиве use-server. IE:
acl server1-ids path_beg -i /items/id1 /istems/id2
use-server server1 if server1-ids