我正在尝试弄清楚如何使用 haproxy 和 SSL 反向代理设置 SSL 场,并且正在寻找一些一般建议:
是否有可能满足以下所有条件:
- 对 SSL 场进行负载平衡请求并具有故障转移功能,因此可以使用多个 SSL 盒(也许 haproxy 中的 sslcheck 会对此有所帮助)。
- 获取包含实际客户端 IP 地址的 HTTP 日志。
- 无需 TProxy
如果这三点都无法实现,我想知道可能会有什么权衡。现在我正在考虑以下事情,但这可能会改变:
Haproxy 443 TCP 代理前端 -> 高端口上的 SSL 代理(可能是 Nginx)-> Haproxy HTTP 前端 -> Web 服务器
我意识到我可能可以跳过第二跳回到 haproxy,但 HAproxy 中所有内容的单一视角可能很好。此外,如果我必须使用 TProxy,也许从 SSL 场回到 haproxy 会使路由更简单?
参考:
http://haproxy.1wt.eu/download/1.5/doc/configuration.txt
http://1wt.eu/articles/2006_lb/index_05.html
答案1
凯尔,
如果您只需要 SSL 部分的故障转移而不需要负载平衡,那么我建议您这样做。在两个节点上安装 haproxy + keepalived + stunnel(已修补)。Keepalived 拥有服务地址并检查 stunnel 和 haproxy 进程的存在以计算其权重,以便状态最佳的节点成为主节点。Stunnel 在端口 443 上接收流量,并在您喜欢的任何端口上本地将其转发到 haproxy。为了让 haproxy 记录客户端的 IP 地址,您需要 stunnel 的 x-forwarded-for 补丁(您可以在我的网站上找到它)。然后,您将告诉 haproxy 记录 x-forwarded-for 标头。
但是有一个限制。如果您支持 HTTP keep-alive,那么 stunnel 将只添加一次 x-forwarded-for 标头,这有点问题。在 Exceliance,我们已经开始开发一个补丁,将连接参数从 stunnel 转发到 haproxy,而不是使用 x-forwarded-for。这样,haproxy 就会相信它从真正的客户端获得连接。如果您有兴趣,请告诉我,我们可以在完成后将其发送给您。
答案2
好吧,我看到这个有点晚了,但是怎么样:
VLAN1 VLAN2
INET -- | -- [SSL] -- | -- [HTTP Load Balancer]
| |
| -- [SSL] -- | -- [WEB01]
| |
| -- [SSL] -- | -- [WEB02]
|
| -- [WEB03] etc
换句话说:
- 简单 DNS 循环发布X服务的 IP 地址,
- 使用前端 SSL 代理(Apache、nginx)直接响应这些 IP。(可选但建议使用 VRRP、CARP 或 Linux-HA 等来确保这些 IP 的高可用性。)
- 所有 SSL 代理都将其请求发送到单臂负载均衡器(为了便于配置,单点 LB/会话管理),
- 最后,LB 将请求发送到 Web 应用程序服务器。
有几件事很明显:
- HAProxy 和 SSL 代理 (nginx) 在功能和使用模型方面非常接近。对普通 HTTP 负载平衡还有其他要求吗(其他地方是否提到过速率限制)?如果没有,那么跳过 HAProxy 并仅使用一种类型的 Web 服务器进行所有 SSL 和 LB 处理(fx nginx)可能会更简洁。
- DNS 轮询可能“足够好”,只需粗略地将负载分散到 2-3 个 SSL 代理上即可。但如果您不喜欢它,那么您可以使用 L4 机制。
获取包含实际客户端 IP 地址的 HTTP 日志。
假设第一个 HTTP 级别设备添加了 X-FORWARDED-FOR 标头,并且您使用类似这或者F5 的IIS 插件,这个应该可以工作。