我正在为所有请求设置一个使用SSL的Web应用程序。 它需要有扩展的空间,也是高度可用的。 似乎“推荐”的处理方法是为HA设置一对第4层负载均衡器,它们通过服务器场进行SSL解密,然后转到第7层负载均衡器的场,然后最后到networking服务器。 (见: http : //1wt.eu/articles/2006_lb/index_09.html )
过去我使用过HAProxy,所以我尝试了一下这样的设置。 基本上我有HAProxy in TCP mode => STunnel => HAProxy in HTTP mode => Apache 。 当我这样做时,可用于apache的客户端IP是第二个HAProxy服务器的IP。 我可以通过让STunnel添加一个X-Forwarded-For头来稍微改进,但是只给了我第一个HAProxy服务器的IP地址。 我无法find让Apache知道原始客户端IP地址的方法。
根据我读过的文档,我不认为HAProxy能够在tcp模式下通过原始客户端的IP地址。 那是对的吗? 如果是这样,是否有任何开源软件负载平衡器可以做到这一点? 如果没有,是否有任何商业/硬件负载平衡器可以?
我想我也应该注意到,这个负载均衡器并不严格地需要成为第4层负载均衡器。 我只需要能够通过SSLstream量到STunnel(或任何我最终使用的SSL解密)。
作为一个侧面说明,我试图设置它没有第4层负载平衡器(即STunnel是链的第一部分)。 这解决了客户端IP问题。 但是,正如上面的文章所预测的,STunnel是瓶颈。 它开始丢失每秒500到600个请求的请求。 而且,当然,这不能通过增加更多的框来扩展(同时维护HA)。 根据我给出的要求,这个应用程序应该能够处理每秒1000-5000个请求的峰值stream量。
我强烈build议看看LVS。 http://www.linuxvirtualserver.org/
它有能力做正常的NAT路由,而且IP隧道和直接路由直接发送回客户端。
你有没有看过: http : //httpd.apache.org/docs/2.3/mod/mod_remoteip.html将重写基于X-Forwarded-for for标题的IP。
F5的BigIP是一个很好的商业解决scheme。 X-Forwarded-For被实现为一个httpconfiguration文件选项。 这并不便宜。
Apache TrafficServer可以设置为插入一个X-Forwarded-For头,它不需要任何费用。 我从来没有使用它,但它有一个configurationvariables:proxy.config.http.append_xforwards_header