Apache代理负载均衡后端服务器故障检测

2024-02-25

这是我的场景(由我的前任设计):

两台 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 文档中找到了一些线索模组代理 http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass and mod_proxy_balancer http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html#stickyness_implementation似乎表明可以检测到故障(“maxattempts = 放弃之前的最大故障转移尝试次数。”,“failonstatus = 单个或逗号分隔的 HTTP 状态代码列表。如果设置,这将强制工作线程在以下情况下进入错误状态:后端返回列表中的任何状态代码。”),但经过几天的搜索,我没有发现任何结论性的说法可以肯定它will(或者至少“应该”)检测后端故障和恢复。

我会说大多数搜索结果都引用使用 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 设置为调试,我也没有看到任何记录表明它检测到其中一个后端服务器已关闭......并且我想百分百确定我可以关闭负载平衡后端进行维护(当然,一次一个),而不会影响生产站点。


http://httpd.apache.org/docs/2.4/mod/mod_proxy.html http://httpd.apache.org/docs/2.4/mod/mod_proxy.html“BalancerMember 参数”部分,property=retry:

如果连接池worker到后端服务器出现错误 状态,Apache httpd 不会将任何请求转发到该服务器,直到 超时到期。这使得[one]能够关闭后端 服务器进行维护,稍后恢复上线。值为 0 意味着始终重试处于错误状态的工作人员,没有超时。

但是,还有其他故障情况无法使用 mod_whatever 捕获,例如,运行应用程序的 IIS 后端已关闭。 IIS 已启动,因此可以建立连接并可以读取页面,只是该页面始终会出现 500 内部服务器错误。在这里,您必须使用failonerror来捕获它并强制工作人员进入错误状态。

在所有情况下,一旦工作线程处于错误状态,流量将不会被定向到它。我一直在尝试不同的方式来处理第一次失败并重试,但似乎总是存在错误页面将其返回给客户端的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache代理负载均衡后端服务器故障检测 的相关文章

随机推荐