如何在 HAProxy 中设置动态变量?

ari*_*tit 6 linux haproxy

是否可以设置一个动态变量来保存 HTTP 标头的内容(例如 Host/X-Forwarded-Host)并稍后在 ACL 中使用?

frontend web1
  # ...
  set-var s1(Host)
  acl site1 hdr_end(host) -i %[s1]
  # ...
  use_backend %[s1] if site1
Run Code Online (Sandbox Code Playgroud)

mwp*_*mwp 5

这里有多种技术的组合。您根本不需要变量来根据主机地址设置 ACL 并使用这些 ACL 选择后端。那会很简单,比如:

frontend web1
  # ...
  acl site1 hdr(host) -i example.com
  acl site2 hdr(host) -i example.net
  # ...
  use_backend com if site1
  use_backend net if site2
Run Code Online (Sandbox Code Playgroud)

这就是您想要做的全部事情,还是您正在尝试完成一些更复杂的事情?

更新:以下是如何根据主机标头选择后端的方法:

frontend web1
  # ..
  http-request set-var(req.s1) req.hdr(Host),field(1,:),lower,regsub(\.,_,g)
  use_backend %[var(req.s1)]

backend example_com
  # ..

backend example_net
  # ..
Run Code Online (Sandbox Code Playgroud)

这将设置一个在请求上下文中有效的变量,使用小写的 Host 标头值并将句点替换为下划线。实际上,你甚至不需要变量:

frontend web1
  # ..
  use_backend %[req.hdr(Host),field(1,:),lower,regsub(\.,_,g)]
Run Code Online (Sandbox Code Playgroud)

如果找不到与 Host 标头匹配的后端,HAproxy 将返回 503。如果您希望此类请求发送到其他地方,您可以设置 a default_backend(我对此进行了测试,至少在 1.6.3 中有效)。