您好,我正尝试将流量路由回用户机器,以便在本地运行网站,但会获取 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 一样。