HAProxy 动态服务器地址

HAProxy dynamic server addresses

我们有与此图类似的设置

当请求到达 HAProxy 时,它会在任何服务器上进行循环平衡,后端服务器会检查其缓存,如果资源不在该服务器上,它会发出重定向 header 设置为正确的服务器 IP。

第二次请求到达 HAProxy,它检测到带有后端服务器的 header 在那里,但我如何获取该 IP 并将请求直接发送给它?

例如,第二次请求到达 haproxy 它有 header X-BACKEND-IP=10.0.0.5

所以 haproxy 尝试负载平衡该请求,我希望它读取 header,获取该 IP 并直接转到该后端。

这可能吗?如果没有,nginx 可以吗?

假设您愿意信任第二个请求的 header 中的 IP,那么可以,您可以使用 use-server:

backend bk_foo
  [...]
  server srv_0a_00_01_05 10.0.1.5:80 weight 100
  server srv_0a_00_02_05 10.0.2.5:80 weight 100
  use-server %[req.hdr(x-backend-ip),lower,map_str(/etc/haproxy/hdr2srv.map,srv_any)] if { req.hdr(x-backend-ip),lower,map_str(/etc/haproxy/hdr2srv.map) -m found }

/etc/haproxy/hdr2srv.map 的内容:

#ip srv_name
# hex of IP used for names in this example
10.0.1.5  srv_0a_00_01_05
10.0.2.5  srv_0a_00_02_05

如果您需要关闭其中一台服务器,您应该动态更新地图以将其删除,以便再次重定向设置为 header 的请求。

如果你有多个后端,你可以用 use_backend 做类似的事情。