我最近发现,您可以根据请求主机头动态匹配后端,如下所示:
use_backend %[req.hdr(host),lower]
但是,有谁知道我可以使用请求主机头的子域来匹配后端吗?
例如,沿着这些思路:
backend one
backend two
use_backend %[<SUBDOMAIN OF HOSTHEADER>,lower]
这将像这样匹配:
one.example.com -> backend one
two.example.com -> backend two
添加和删除 DNS 条目允许您将子域即时路由到各种后端,但您仍然需要定义这些后端,因此仍然需要重新启动服务。因此,我不完全确定此配置的有用性。
无论如何,这就是你的做法。
我们知道我们可以
host
使用req.hdr (req.hdr(host)
) 找到标头的内容,但这给了我们请求的 FQDN,而不是子域。值得庆幸的是,我们应该能够将一个regsub转换器应用于示例,以剪掉基域和 TLD。
req.hdr
该引用中的重点是我的,旨在表明在这种情况下,您需要的正则表达式是
^(.*)(?:\..*){2}$
,由于括号,它不起作用。因此,您需要使用现场转换器。
如果我们将整个示例管道放在一起,则该
use_backend
行如下所示:现在,这开启了将进入同一后端的事实
one.*.*
,并可能导致一些非常奇怪的情况。检查基本域和 TLD 以确保它们是您所期望的可能是有意义的。假设您只有两个 (
example.com
和foo.com
),您将使用req.hdr_end(host)
它们来检查它们,使 ACL 看起来像:如果我们把它们放在一起,整个配置看起来像这样:
如果您愿意,您可以通过为每个子域、每个基本域设置不同的“动态”后端来获得更高级的体验;你只需要使用上面的部分来解决这个问题。
据我所知,HAProxy 不支持正则表达式从 Host 标头中提取子域的特定部分,然后将该值分配给一个变量,该变量稍后用于形成完整的后端名称。
但是,解决问题的一种方法是使用映射:
的内容
/etc/haproxy/subdomains.map
如下所示:所有与该文件中的任何子域都不匹配的请求都将转到
backend_main
后端。