提问者:小点点

如何正确配置Apache Httpd作为负载均衡器,其中某些主机可能不可用


我使用Apache Httpd实例作为多个JavaTomcat实例的代理。Apache充当Tomcat实例的负载均衡器。

apache配置基本上如下所示

<Proxy balancer://mycluster>
    BalancerMember ajp://host1:8280 route=jvmRoute-8280
    BalancerMember ajp://host2:8280 route=jvmRoute-8280
    BalancerMember ajp://host3:8280 route=jvmRoute-8280
</Proxy>
<VirtualHost *:80>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>

这基本上适用于在Tomcat实例中配置AJP端口。请求被发送到其中一台主机,负载分布在Tomcat实例中。

然而,我看到很长的延迟,似乎是在Httpd内部造成的,每当一个主机不可用时,即Apache似乎不记得其中一个主机不可用,并反复尝试将请求也发送到丢失的主机,而不是将其发送到一个可用的主机,并在一段时间后尝试失败的主机。

有没有一种方法可以从Apache Httpd配置mod_proxyet.al来支持这样的故障转移场景,即拥有多个主机并且在一个主机发生故障时不会导致巨大的延迟?最好是Apache应该在后台定期检查哪些主机已经消失,而不是作为任何请求的主机。

我确实找到了HAProxy,它似乎更适合这种事情,但出于一些不相关的原因,我更愿意坚持使用Apache。

与此同时,我发现我的部分问题是由客户端导致的,客户端无休止地保持连接打开,因此没有更多的连接/线程可用。

因此,我将问题更改为:您将使用哪些配置选项来最小化此类影响?即在这种情况下允许许多打开的连接或快速关闭它们?否则,这听起来像是一个非常容易的DOS攻击与我当前的配置?


共3个答案

匿名用户

客户端不会无休止地保持连接打开。检查您的Apache server-tune. conf并查找KeepAliveTimeout设置。将其降低到合理的水平。

您必须要更改连接超时和重试。不过,我会降低连接超时。10秒仍然很老。如果后端在同一位置,为什么不以毫秒为单位设置它?连接超时=200ms应该有足够的时间来设置连接。

匿名用户

我想我至少找到了一种解决方法或简单的解决方案。默认情况下,mod_proxy似乎有一个很长的连接超时时间(300秒)。如果您不设置不同的设置,将需要很长时间才能检测到离线节点处于“错误”状态。

通过设置一个短的连接超时并增加重试,我可以让它对我更好:

BalancerMember ajp://host1:8280 route=jvmRoute-8280 connectiontimeout=10 retry=600

这将确保快速检测到失败的连接,并且Apache不会经常重试以到达失败的服务器。不幸的是,Apache似乎使用实际请求来检查平衡成员,因此当它尝试到达以前处于错误状态的服务器时,单个请求可能会变慢。似乎没有心跳或看门狗功能。对于这样的事情,其他负载平衡解决方案带来了这样的功能,特别是HAProxy

阅读mod_proxy和mod_proxy_balancer了解更多细节。

此外,通过mod_status服务器状态和平衡管理器通过mod_balancer提供的页面在诊断这方面有很大帮助!

匿名用户

似乎你忘记了ping标签(实际上它叫做CPING-100-继续)

像这样:

<Proxy "balancer://www">
    BalancerMember "http://192.168.0.100:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.101:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.102:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.103:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.104:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.105:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.106:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    SetEnv proxy-nokeepalive 1
</Proxy>
ProxyPass "/www/" "balancer://www/"
ProxyPassReverse "/www/" "balancer://www/"