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

6

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

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

HAproxy 的版本是什么? - mwp
1个回答

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

你是只想做这件事情,还是试图完成更复杂的任务?

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

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
  # ..

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

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

如果找不到与主机头匹配的后端,则HAproxy将返回503。如果您希望这样的请求去其他地方,可以设置default_backend(我测试过,在1.6.3中有效,至少如此)。


这不仅仅是关于几个应用程序/网站的列表。可能存在多个未知的“后端”。所有请求都应动态重定向到HTTP主机头(IP/域名)。 - aristit
@aristit 好的,所有后端都必须在运行时在haproxy.cfg中枚举,因此您不能有任何“未知”的后端。您需要根据已知后端列表检查主机标头,以防止HAproxy尝试使用不存在的后端。更大的问题是我不确定您是否可以将变量作为use_backend的第一个参数插值。我会试着玩一下... - mwp
@aristit 这并不像我想象中的那么糟糕!看看这是否符合您的需求。 - mwp
@aristit 很高兴能帮忙!如果对您有帮助,请检查答案。 :) - mwp
1
很遗憾,目前没有好的方法(至少我不知道)来测试HAProxy配置文件。通常我会以调试模式运行HAProxy(即使用“-d”参数),并发送一些请求来测试所需的行为。 - mwp
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接