基于标头值的 HAProxy 动态服务器地址

基于标头值的 HAProxy 动态服务器地址

您好,我正尝试将流量路由回用户机器,以便在本地运行网站,但会获取 HAProxy 提供的其他来源的标头/cookie/路由逻辑。但到目前为止,我还不知道该怎么做。文档说使用环境变量是有用的https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4-server

地址字符串的任何部分都可以引用任意数量的环境变量,通过在其名称前加上美元符号(“$”)并可选择用括号(“{}”)将它们括起来,类似于 Bourne shell 中的做法。

但我猜想有一种方法可以使用 acl 或样本提取,但我实在想不出该怎么做。下面是我尝试过的一个例子。我通过删除 ${hdr(originalIp)} 并使用我的 IP 进行了概念验证,但我希望它在存在 cookie 的情况下动态使用请求者的 IP

### Sample config
acl has_local_cookie cook_sub(local) -i true
use_backend local    if has_local_cookie
backend local
server local-origin ${hdr(originalIp)}:443 ssl verify none

答案1

您所尝试的问题在于,您将整个配置视为在运行时不断被解析和解释,但事实并非如此。

各种指令的某些参数是静态的,其他参数是动态的,但server声明大多数肯定是静态的。服务器只代表一个目标地址,而不是每个请求都代表不同的地址。

您需要为每个开发人员配置一个后端,或者您可以将他们全部放在一个后端,backend local为每个开发人员声明一个服务器,,,server dev-1 192.168.1.1:80 ...等等server dev-2 ...

然后use_backend local if { cook_sub(local) -i true }

然后在后端添加一个use-server以将服务器名称与use-server dev-1 if { src 192.168.1.1 }每个开发人员的源 IP 匹配。

请注意,这{ ... }是匿名 ACL,这是一种更简洁(恕我直言)的测试简单条件的方法,特别是当条件仅在配置中的一个位置进行评估时。如果您在多个位置测试相同的条件,则命名 ACL 更合适,因为它们仅在一个位置进行编辑,因此您不必在多个位置更新它们,就像您在配置中复制粘贴相同的匿名 ACL 一样。

相关内容