我使用以下configuration来负载平衡https连接,使用haproxy 1.4.8。 SSL卸载是由Apache完成的。
listen ssl_to_waf 192.168.101.54:443 mode tcp balance roundrobin option ssl-hello-chk server wafA 192.168.101.61:444 check listen ssl_from_waf 192.168.101.61:445 balance roundrobin option forwardfor server webA 192.168.101.46:80 check
对于HTTP请求这很好,请求分发到我的Apache服务器就好了。 但是对于HTTPS请求,我丢失了“forwardfor”信息。 我需要保存客户端IP地址。 如何使用HAproxy在多个SSL服务器之间进行负载均衡,使这些服务器知道客户端的IP地址?
简短的回答:你不能。
HAProxy不理解SSL,因此在TCP模式下平衡这些连接。 forwardfor选项在TCP模式下并不意味着什么,因为它是一个HTTP头。
我已阅读的有关SSL和HAProxy的所有内容都build议在 HAProxy 前使用其他软件来处理SSL卸载。 有些build议是Pound和nginx,但是提出了一个有效的观点,那就是负载均衡代理服务器本身,为什么会引入额外的复杂性和额外的跳跃,当你可以让其中一个处理负载平衡并移除HAProxy完全?
升级到haproxy 1.5-dev12并启用SSL卸载。 然后,即使客户端使用SSL,后端服务器也会获得HTTP连接。 而且由于haproxy可以看到SSL会话内部,它可以添加forwardfor头。
我绝不会build议在生产环境中使用开发软件。 我在同一台机器上的ha代理前面使用nginx作为ssl。 即使在沉重的负荷下也能像魅力一样运作 你的Apache服务器将获得httpstream量。 您需要将x-forwarded-for标头发送给apache,然后安装mod-rpaf模块,以便apache可以看到客户端ip。 您可能还需要设置一个Apache的env变种,所以应用程序将知道连接是在SSL。