基于所选服务器的 HAProxy 重定向

HAProxy redirect based on the selected server

我正在尝试设置 HAProxy 以根据负载均衡器选择的服务器更改目标 URL,我有 3 个 Web 服务,每个服务都部署在 AWS、GCP 和 AZURE 的每个服务中

但是在 HAProxy 中,我不能在服务器地址上加上破折号 / 来强制向 example.com/helloWorld 发出请求,例如,到 address3.com/api/helloWorld,这是我需要的是,我希望 HAProxy 使用提供的平衡方法为我选择一个服务器,然后让它根据选择的服务器调用正确的 Web 服务。

frontend example.com
    bind 0.0.0.0:80
    use_backend back_farm
    default_backend back_farm
backend back_farm
    mode http
    balance roundrobin
    option httpclose
    option forwardfor
    server awsback address1.com/
    server azrback address2.com/bucketName/
    server gcpback address3.com/api/

我尝试创建一个 ACL 来检查选定的服务器,但它似乎无法识别文档中提到的 %s 参数,而且我也没有找到更好的替代品。

backend back_farm
    mode http
    balance roundrobin
    option httpclose
    option forwardfor
    server awsback address1.com
    server azrback address2.com
    server gcpback address3.com

    acl is_azr %s -i azrback
    acl is_gcp %s -i gcpback

    http-request redirect code 301 location http://%[hdr(host)]%[url,regsub(^/service,/api/service,)] if is_azr 
    http-request redirect code 301 location http://%[hdr(host)]%[url,regsub(^/service,/bucketName/service,)] if is_gcp

我在这里做错了什么,或者我可以用什么其他方式来强制根据目标服务器更改地址? 有什么想法或指导吗?

即使这不是问题的 100% 答复,因为我必须从 HAProxy 切换到 NGINX 才能实现我的意图,我想把我在这里找到的解决方案留给其他人觉得有用。

我能够使用以下配置实现此目的:

upstream backend.example.com {
    server aws.backend.example.com:8091;
    server azr.backend.example.com:8092;
    server gcp.backend.example.com:8093;
}

server {
    listen 80;
    listen [::]:80;
    server_name backend.example.com;
    location / {
        proxy_pass http://backend.example.com;
    }
}
server {
    listen 8091;
    listen [::]:8091;
    server_name aws.backend.example.com;
    location / {
        proxy_pass http://address1.com:80/;
    }
}
server {
    listen 8092;
    listen [::]:8092;
    server_name azr.backend.example.com;
    location / {
        proxy_pass http://address2.com:80/api/;
    }
}
server {
    listen 8093;
    listen [::]:8093;
    server_name gcp.backend.example.com;
    location / {
        proxy_pass http://address3.com:80/bucketName/;
    }
}