У меня есть некоторая логика во внешнем интерфейсе, которая направляет на разные серверные части на основе как хоста, так и URL-адреса. Логически это выглядит так:
if hdr(host) ends with 'a.domain.com':
if url starts with '/dir1/':
use backend domain.com/dir1/
elif url starts with '/dir2/':
use backend domain.com/dir2/
# ... else if ladder repeats on different dirs
elif hdr(host) ends with 'b.domain.com':
# another else if ladder exactly the same as above
# ...
# ... else if ladder repeats like this on different domains
Есть ли способ сгруппировать ACL, чтобы избежать повторной проверки ACL домена?
Очевидно, что для каждой возможности должен существовать оператор use backend, но я не хочу, чтобы вам приходилось проверять домен снова и снова, потому что это очень неэффективно.
Другими словами, я хочу этого избежать:
use backend domain.com/url1/ if acl-domain.com and acl-url1
use backend domain.com/url2/ if acl-domain.com and acl-url2
use backend domain.com/url3/ if acl-domain.com and acl-url3
# tons more possibilities below
потому что он должен постоянно проверять acl-domain.com.
Это особенно проблема, потому что у меня есть особые правила для поддоменов, таких как a.domain.com и b.domain.com, но я хочу вернуться к наиболее распространенному случаю * .domain.com. Это означает, что каждое отдельное правило, использующее конкретный поддомен, должно быть проверено до * .domain.com, что делает его еще более неэффективным в общем случае.
У вас возникли проблемы с производительностью текущего приложения?
Если вам определенно нужно повысить производительность на уровне HAProxy, я бы предложил просто использовать отдельный экземпляр HAProxy для каждого поддомена. Например, создайте новый сервер HAProxy и укажите a.domain.com непосредственно на новый сервер. Вы также можете продолжать указывать все записи DNS на основной сервер HAProxy, а первый уровень HAProxy обрабатывать только сопоставление поддоменов.
Конечно, если у вас действительно нет проблем с производительностью, то, может быть, лучше оставить достаточно хорошо в покое.