我一直在阅读有关使用 HaProxy 进行负载平衡的文章,想知道如果我不进行任何第 7 层处理,是否可以使用此负载平衡器?我认为在 TCP 级别负载平衡中仅使用循环可以与 SSL 连接一起使用?我只接受 SSL(根本不接受 HTTP)。我不想在负载平衡器上终止 SSL(这就是我想避免使用 STunnel 的原因)。
谢谢。
答案1
如果您想在负载均衡器上终止 SSL,那么您别无选择,只能使用 Stunnel、Pound 或 Nginx 之类的东西。HA-Proxy 不支持终止 SSL 本身。
或者,您可以在 Web 服务器上终止 SSL。在这种情况下,只需设置 HA-Proxy 以将 TCP(HTTPS/443)连接传递到您的 Web 服务器即可。但请记住,在此模式下,您将无法执行任何 L7 检查或规则,而这正是 HA-Proxy 如此强大的原因。
答案2
您可以使用 haproxy 对多个后端服务器的 SSL 连接进行负载平衡,这样后端服务器就会终止 SSL,而不是 haproxy。唯一的技巧是在 haproxy 和后端服务器上都启用代理协议,这样用户的真实 IP 地址就会得到保留。
例如,如果你有两个 nginx 应用服务器10.0.0.11
和10.0.0.12
一个 haproxy 负载均衡器10.0.0.10
。编辑/etc/haproxy/haproxy.cfg
添加以下行:
frontend https-in
bind *:443
default_backend https-servers
backend https-servers
mode tcp
balance roundrobin
server srv1 10.0.0.11:443 send-proxy
server srv2 10.0.0.12:443 send-proxy
使用如下 nginx 服务器配置:
server {
server_name example.com;
root /opt/example/current/app;
listen 443 ssl http2 proxy_protocol;
set_real_ip_from 10.0.0.10/32;
real_ip_header proxy_protocol;
ssl_certificate /etc/ssl/example/ssl.crt;
ssl_certificate_key /etc/ssl/example/ssl.key;
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/app.sock;
}
}
这告诉 haproxy 设置一个第 4 层代理,将所有未修改的 TCP 连接转发到两个 nginx 服务器,使用循环来平衡连接。nginx 应用服务器将分担协商 SSL 和解析 HTTP 请求的负载。代理协议将原始客户端的 IP 地址从 haproxy 转发到 nginx,而无需修改 HTTP 请求标头。请注意我们如何告诉 nginx 信任您的 haproxy 负载均衡器的 IP 地址,10.0.0.10
以便为我们提供客户端的真实 IP。SSL 分布在您的两个 nginx 应用服务器之间,并且您的 nginx 日志文件显示每个请求的正确客户端 IP 地址。
我写了一篇博客文章来描述这一点:
https://wakatime.com/blog/34-how-to-scale-ssl-with-haproxy-and-nginx