在某些主机可能不可用的情况下,如何将Apache Httpd正确配置为负载平衡器
我使用一个apachehttpd实例作为多个javatomcat实例前面的代理。Apache充当Tomcat实例的负载平衡器 apache配置基本上如下所示在某些主机可能不可用的情况下,如何将Apache Httpd正确配置为负载平衡器,apache,proxy,load-balancing,Apache,Proxy,Load Balancing,我使用一个apachehttpd实例作为多个javatomcat实例前面的代理。Apache充当Tomcat实例的负载平衡器 apache配置基本上如下所示 <Proxy balancer://mycluster> BalancerMember ajp://host1:8280 route=jvmRoute-8280 BalancerMember ajp://host2:8280 route=jvmRoute-8280 BalancerMember ajp:/
<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>
平衡员ajp://host1:8280 路由=JVM路由-8280
平衡员ajp://host2:8280 路由=JVM路由-8280
平衡员ajp://host3:8280 路由=JVM路由-8280
ProxyPass/balancer://mycluster/
ProxyPassReverse/balancer://mycluster/
这在Tomcat实例中配置AJP端口时基本上是有效的。请求被发送到其中一个主机,负载分布在Tomcat实例上
但是,我看到,每当其中一台主机不可用时,Httpd内部似乎会出现很长的延迟,也就是说,Apache似乎不记得其中一台主机不可用,并反复尝试向丢失的主机发送请求,而不是将请求发送到其中一台可用主机,然后在稍后某个时间尝试故障主机
是否有办法配置mod_proxy等。从Apache Httpd到支持这种故障切换场景,即拥有多台主机并且在一台主机发生故障时不会造成巨大延迟?最好是Apache应该定期在后台检查哪些主机已离开,而不是作为任何请求的主机
我确实找到了更适合这种情况的方法,但出于一些不相关的原因,我更愿意使用Apache
更新 与此同时,我发现我的问题的一部分是由客户端造成的,客户端使连接无限期地打开,因此没有更多的连接/线程可用 因此,我将问题改为:
您将使用哪些配置选项来最小化此类操作的影响?也就是说,在这种情况下,允许多个打开的连接或快速关闭它们?否则,用我当前的配置,这听起来像是一个非常容易的拒绝服务攻击?我想我至少找到了一种解决方法或简单的解决方案。默认情况下,mod_代理似乎有很长的connectiontimeout(300秒)。如果不进行不同的设置,则需要很长时间才能检测到脱机节点处于“err”状态 通过设置较短的connectiontimeout并增加重试次数,我可以让它更好地为我工作:
BalancerMember ajp://host1:8280 route=jvmRoute-8280 connectiontimeout=10 retry=600
这将确保能够相当快地检测到失败的连接,并且Apache不会太频繁地重试以访问失败的服务器。不幸的是,Apache似乎使用实际请求来检查余额成员,因此,当它试图到达之前处于错误状态的服务器时,单个请求有时可能会很慢。似乎没有心跳或看门狗功能。对于这种情况,其他负载平衡解决方案带来了这样的特性,尤其是
请阅读和了解更多详细信息
此外,服务器状态via和平衡管理器via对诊断此问题有很大帮助 客户端不会无限期地保持连接打开。检查Apache server-tuning.conf并查找KeepAliveTimeout设置。把它降低到合理的程度
您必须对connectiontimeout和retry进行更改。不过,我还是要准时下班。10秒还是很长的时间。如果后端位于同一位置,为什么不以毫秒为单位进行设置?connectiontimeout=200ms应该留出足够的时间来建立连接。您似乎忘记了ping标记(实际上称为CPING-100 Continue) 像这样:
<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/"
“成员”http://192.168.0.100:80“最大值=128 ttl=300重试=60连接超时=5超时=300 ping=2
“成员”http://192.168.0.101:80“最大值=128 ttl=300重试=60连接超时=5超时=300 ping=2
“成员”http://192.168.0.102:80“最大值=128 ttl=300重试=60连接超时=5超时=300 ping=2
“成员”http://192.168.0.103:80“最大值=128 ttl=300重试=60连接超时=5超时=300 ping=2
“成员”http://192.168.0.104:80“最大值=128 ttl=300重试=60连接超时=5超时=300 ping=2
“成员”http://192.168.0.105:80“最大值=128 ttl=300重试=60连接超时=5超时=300 ping=2
“成员”http://192.168.0.106:80“最大值=128 ttl=300重试=60连接超时=5超时=300 ping=2
SetEnv代理nokeepalive 1
ProxyPass“/www/”“balancer://www/"
ProxyPassReverse“/www/“”balancer://www/"
我目前无法在下周之前测试这一点,但我认为这将有助于我进一步前进,因此我授予奖金,尽管我希望获得更多关于这里发生的事情的深入信息