这是我的情况(由我的前任设计):
有两个Apache服务器担任反向代理的职责,为多个混合后端Web服务器(Apache,IIS,Tomcat等)提供服务。对于某些站点,我们有多个后端Web服务器,对于这些情况,我们采取以下做法:
<Proxy balancer://www.example.com>
BalancerMember http://192.168.1.40:80
BalancerMember http://192.168.1.41:80
</Proxy>
<VirtualHost *:80>
ServerName www.example.com:80
CustomLog /var/log/apache2/www.example.com.log combined
<Location />
Order allow,deny
Allow from all
ProxyPass balancer://www.example.com/
ProxyPassReverse balancer://www.example.com/
</Location>
</VirtualHost>
在这个例子中,我有一个站点(www.example.com)在代理服务器的配置中,并且该站点被代理到两个后端服务器192.168.1.40和.41中的一个。
我正在评估它,以确保我们所有的Web服务都具有容错性(为此已经将两个反向代理服务器放入共享IP集群中),并且我想确保负载平衡的后端服务器也具有容错性。但是我无法确定mod_proxy_balancer模块是否内置了后端故障检测(以及避免失败的后端服务器的逻辑)...
因此,如果192.168.202.40失败了,Apache会检测到这一点吗(如果需要,它将需要失败的请求),并自动将所有请求路由到另一个后端,192.168.202.41?还是它将继续在故障的后端和运行的后端之间平衡请求?
我在Apache文档mod_proxy和mod_proxy_balancer中找到了一些线索,这些线索似乎表明可以检测到故障(“maxattempts =在放弃之前的最大故障转移尝试次数。”,“failonstatus = HTTP状态代码的单个或逗号分隔列表。如果设置了这个,当后端返回列表中的任何状态码时,这将强制工作进入错误状态。”),但是经过几天的搜索,我没有找到确切说明它一定会(或至少“应该”)检测到后端故障和恢复。
我想说的是,大多数搜索结果都提到使用AJP协议将流量传递到后端服务器,而这显然支持故障检测-但我的后端是Apache、IIS、Tomcat和其他混合物,我相当肯定其中许多不支持AJP。它们还是运行各种不同应用程序的Windows 2k3/2k8和Linux(主要是Ubuntu Lucid)箱子,这些应用程序具有各种不同的需求,因此像Backhand和LVS这样的附加模块对我来说不是选项。
我也尝试通过创建一个新的测试站点来实证测试这个特性,就像这样:
<Proxy balancer://test.example.com>
BalancerMember http://192.168.1.40:80
BalancerMember http://192.168.1.200:80
</Proxy>
<VirtualHost *:80>
ServerName test.example.com:80
CustomLog /var/log/apache2/test.example.com.log combined
LogLevel debug
<Location />
Order allow,deny
Allow from all
ProxyPass balancer://test.example.com/
ProxyPassReverse balancer://test.example.com/
</Location>
</VirtualHost>
当192.168.1.200是一个虚假的地址,没有运行任何Web服务器时,可以模拟后端故障。对于一堆不同的客户端机器,测试网站都能够正常提供服务,但即使将LogLevel设置为debug,我也没有看到任何日志记录表明它检测到其中一个后端服务器已经关闭...我想确保我可以百分之百地进行负载均衡后端服务器的维护(当然是一个接一个),而不会影响生产站点。
maxattempts
(请参见 http://serverfault.com/questions/503531/apache2-proxy-tomcat6-prevent-503-error-while-starting/503539#503539)。 - Max Leske