我在前端有一些逻辑,可以根据主机和 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 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 之前检查使用特定子域名的每条规则,这使得常见情况的效率更低。
答案1
您当前的应用程序是否遇到了性能问题?
如果您确实需要在 HAProxy 级别提高性能,那么我建议为每个子域使用单独的 HAProxy 实例。例如,创建一个新的 HAProxy 服务器,并将 a.domain.com 直接指向新服务器。您还可以继续将所有 DNS 条目指向主 HAProxy 服务器,并让第一个 HAProxy 层仅处理子域匹配。
当然,如果您实际上没有遇到性能问题,那么也许最好不要管它。