我一直在阅读有关HaProxy的负载平衡,并想知道如果我不做任何第7层处理,是否可以使用这个负载平衡器? 我想在TCP级别负载平衡只使用roundrobin可以与SSL连接? 我只接受SSL(没有任何HTTP)。 我不想在负载平衡器上终止SSL(这就是为什么我想避免STunnel)。
谢谢。
如果你想在负载平衡器上终止SSL,那么你别无select,只能使用Stunnel,Pound或Nginx。 HA-Proxy不支持终止SSL本身。
或者,您可以在Web服务器上终止SSL。 在这种情况下,只需设置HA-Proxy即可通过TCP(HTTPS / 443)连接到您的Web服务器。 虽然记住在这种模式下,你将不能做任何L7检查或规则,这是什么使HA-Proxy如此强大。
您可以使用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服务器configuration如下:
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层代理,使用roundrobin将未经修改的所有TCP连接转发到两个nginx服务器以平衡连接。 nginx应用程序服务器将共享协商SSL和parsingHTTP请求的负载。 代理协议将始发客户端的IP地址从haproxy转发到nginx,而无需修改HTTP请求标头。 注意我们是如何告诉nginx信任你的haproxy负载平衡器10.0.0.10
的IP地址给我们客户端的真实IP。 SSL分布在你的两个nginx应用服务器中,你的nginx日志文件为每个请求显示正确的客户端IP地址。
我写了一篇博客文章描述这个:
https://wakatime.com/blog/34-how-to-scale-ssl-with-haproxy-and-nginx