Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在某些主机可能不可用的情况下,如何将Apache Httpd正确配置为负载平衡器_Apache_Proxy_Load Balancing - Fatal编程技术网

在某些主机可能不可用的情况下,如何将Apache Httpd正确配置为负载平衡器

在某些主机可能不可用的情况下,如何将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:/

我使用一个apachehttpd实例作为多个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>

平衡员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/"

我目前无法在下周之前测试这一点,但我认为这将有助于我进一步前进,因此我授予奖金,尽管我希望获得更多关于这里发生的事情的深入信息