我正在尝试设置一个 HAProxy,它将监听端口 80,并循环重定向位置任何流量到两台服务器,同时执行健康检查check
。
服务器有不同的 URL,所以据我所知我不能使用server <name> <ip>:<port> check
行,因为我想让客户端的浏览器读取https:///ssl1.blah.com或者https://ssl2.blah.com
这是我的haproxy.cfg:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#debug
#quiet
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webfarm *:80
mode http
stats enable
stats auth admin:apassword
balance roundrobin
option forwardfor
redirect location https://ssl1.blah.com/gohere
redirect location https://ssl2.blah.com/gohere
任何指点都将不胜感激。这是我第一次使用 HAProxy 或任何软件 NLB。
谢谢
答案1
我不思考您可以平衡重定向。如果此部署的目的是将发往这些服务器的所有流量从 http 重定向到 https,则您需要监听两个单独的 IP,并相应地进行重定向。这意味着用户必须提前知道子域。
我觉得你尝试做的事情不太好。用户将访问你的前端 URL,并被重定向到两个子域之一。如果他们返回,他们可能会被重定向到另一个子域。作为用户,我会觉得这非常尴尬。
负载平衡的目的,是模糊集群中有多少台服务器和哪些服务器的实现细节,并提供统一的前端。
我建议做类似以下的事情:
Frontend: 10.80.11.1:80 # http://blah.com/
Backend 1: 10.80.11.5:443
Backend 2: 10.80.11.6:443
在每个后端,让其默认页面加载,/gohere
而不是尝试让 HA 代理重写 URL。现在您可以根据需要进行负载平衡,隐藏用户的详细信息。
如果您确实想要实现子域名的重写,您可以尝试这样做:
Frontend: 10.80.11.1:80 # http://blah.com
balance roundrobin
Backend: server 10.80.11.2:80
Backend: server 10.80.11.3:80
Frontend: 10.80.11.2:80 # http://ssl1.blah.com
redirect location https://ss1.blah.com
Frontend: 10.80.11.3:80 # http://ssl2.blah.com
redirect location https://ssl2.blah.com
但是,您需要在所有 3 台主机上安装 HA Proxy(除非上述任何后端共享一个主机并具有多个 NIC)。
如果您使用 Apache 作为后端,您可以非常非常简单地实现 https 重定向,而不应该使用 HA Proxy 来管理它。
答案2
我想我明白你想要什么,但不是 100% 确定。我认为你需要将“listen”节重写为两个单独的“frontend”和“backend”节。这样,你应该能够向后端添加检查,但仍然保留重定向/URL 混淆。
看一些 haproxy 示例,“listen”用于简短而完整的规则集,但 backend+frontend 用于更复杂的设置。