当使用 HAProxy 进行虚拟托管时,我可以看到如何使用前端标头中的主机来决定要路由到哪个后端。但是,是否可以将后端设为包含路径的 URL(与设置虚拟托管时使用 apache 或 nginx 所做的操作类似)。
http://www.techrawr.com/tag/haproxy/- 显示了大部分内容。但是,如果后端位于一台服务器上,但后端 1 和后端 2 是服务器,情况会怎样?
答案1
我认为您正在寻找类似这样的东西,以便根据 URL 平衡不同的服务器:
frontend http-farm
bind 0.0.0.0:80
acl app1web hdr_beg(host) -i app1 # for http://app1.domain.com
acl app2web hdr_beg(host) -i app2 # for http://app2.domain.com
acl msg-url-1 url_reg ^\/path/games/.*
acl msg-url-2 url_reg ^\/path/photos/.*
acl msg-url-3 url_reg ^\/path/mail/.*
acl msg-url-4 url_reg ^\/path/wazap/.*
use_backend games if msg-url-1 app1web
use_backend photos if msg-url-2 app2web
use_backend mail if .....
backend games
option httpchk GET /alive.php HTTP/1.1\r\nHost:\ app1.domain.com
option forwardfor
balance roundrobin
server appsrv-1 192.168.1.10:80 check inter 2000 fall 3
server appsrv-2 192.168.1.11:80 check inter 2000 fall 3
backend photos
option httpchk GET /alive.php HTTP/1.1\r\nHost:\ app2.domain.com
option forwardfor
balance roundrobin
server appsrv-1 192.168.1.13:80 check inter 2000 fall 3
server appsrv-2 192.168.1.14:80 check inter 2000 fall 3
答案2
HAProxy 中的“server”指令支持许多参数,其中一个选项是“redir”参数。您可以使用它将 HTTP 302 重定向发送回客户端 - 并让客户端与后端通信(但这不会代理):
例子:
backend www_example_com
balance roundrobin
server Backend1 10.0.0.1:80 redir http:// www.example.com/backend1
server Backend2 10.0.0.1:80 redir http:// www.example.com/backend2
答案3
如果只有 HA 代理具有公共端口,则重定向到后端不是一个好的解决方案。为此,您可能希望 ha 代理按其预期完成工作,但我不确定根据负载平衡的结果修改路径是否是一个好的做法。
我在 stackoverflow 的一个类似问题下发布了我的解决方案,请查看以获取更多信息详细解答