基于所选服务器的 HAProxy 重定向
HAProxy redirect based on the selected server
我正在尝试设置 HAProxy 以根据负载均衡器选择的服务器更改目标 URL,我有 3 个 Web 服务,每个服务都部署在 AWS、GCP 和 AZURE 的每个服务中
- AWS 位于 address1.com/service
- AZR位于地址2。com/bucketName/service
- GCP 位于地址 3。com/api/service
但是在 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/;
}
}
我正在尝试设置 HAProxy 以根据负载均衡器选择的服务器更改目标 URL,我有 3 个 Web 服务,每个服务都部署在 AWS、GCP 和 AZURE 的每个服务中
- AWS 位于 address1.com/service
- AZR位于地址2。com/bucketName/service
- GCP 位于地址 3。com/api/service
但是在 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/;
}
}