我有Apache作为3个Tomcat服务器前面的负载平衡器。 偶尔,Apache返回503个响应,我想完全删除。 所有4个服务器在CPU,内存或磁盘方面都没有大的负载,所以我有点不确定是什么限制或为什么。 当所有工人都处于错误状态时,503就会退回 – 无论如何。 以下是详细信息:
Apacheconfiguration:
<IfModule mpm_prefork_module> StartServers 30 MinSpareServers 30 MaxSpareServers 60 MaxClients 200 MaxRequestsPerChild 1000 </IfModule> ... <Proxy *> AddDefaultCharset Off Order deny,allow Allow from all </Proxy> # Tomcat HA cluster <Proxy balancer://mycluster> BalancerMember ajp://10.176.201.9:8009 keepalive=On retry=1 timeout=1 ping=1 BalancerMember ajp://10.176.201.10:8009 keepalive=On retry=1 timeout=1 ping=1 BalancerMember ajp://10.176.219.168:8009 keepalive=On retry=1 timeout=1 ping=1 </Proxy> # Passes thru track. or api. ProxyPreserveHost On ProxyStatus On # Original tracker ProxyPass /m balancer://mycluster/m ProxyPassReverse /m balancer://mycluster/m
Tomcatconfiguration:
<Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Engine> </Service> </Server>
Apache错误日志:
[Mon Mar 22 18:39:47 2010] [error](70007)指定的超时已过期:proxy:AJP:尝试连接到10.176.201.10:8009(10.176.201.10)失败 [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend禁用worker(10.176.201.10) [Mon Mar 22 18:39:47 2010] [error] proxy:AJP:无法连接到后端:10.176.201.10 [Mon Mar 22 18:39:47 2010] [error](70007)指定的超时已过期:proxy:AJP:尝试连接到10.176.201.9:8009(10.176.201.9)失败 [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend禁用worker(10.176.201.9) [Mon Mar 22 18:39:47 2010] [error] proxy:AJP:无法build立连接到后端:10.176.201.9 [Mon Mar 22 18:39:47 2010] [error](70007)指定的超时已过期:proxy:AJP:尝试连接到10.176.219.168:8009(10.176.219.168)失败 [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend禁用worker(10.176.219.168) [Mon Mar 22 18:39:47 2010] [error] proxy:AJP:无法连接到后端:10.176.219.168 [Mon Mar 22 18:39:47 2010] [error] proxy:BALANCER :(平衡器:// mycluster)。 所有工人都处于错误状态 [Mon Mar 22 18:39:47 2010] [error] proxy:BALANCER :(平衡器:// mycluster)。 所有工人都处于错误状态 [Mon Mar 22 18:39:47 2010] [error] proxy:BALANCER :(平衡器:// mycluster)。 所有工人都处于错误状态 [Mon Mar 22 18:39:47 2010] [error] proxy:BALANCER :(平衡器:// mycluster)。 所有工人都处于错误状态 [Mon Mar 22 18:39:47 2010] [error] proxy:BALANCER :(平衡器:// mycluster)。 所有工人都处于错误状态 [Mon Mar 22 18:39:47 2010] [error] proxy:BALANCER :(平衡器:// mycluster)。 所有工人都处于错误状态
负载平衡器top信息:
顶部 - 23:44:11最多210天,4:32,1个用户,平均负载:0.10,0.11,0.09 任务:共135次,2次跑步,133次睡眠,0次停止,0次僵尸 Cpu:0.1%us,0.2%sy,0.0%ni,99.2%id,0.1%wa,0.0%hi,0.1%si,0.3%st Mem:共524508k,使用517132k,7376k免费,9124k缓冲区 交换:总共1048568k,使用352k,1048216k免费,334720kcaching
Tomcat top信息:
顶部 - 23:47:12最多210天,3:07,1位用户,平均负载:0.02,0.04,0.00 任务:63总计,1跑步,62睡觉,0停止,0僵尸 Cpu(s):0.2%us,0.0%sy,0.0%ni,99.8%id,0.1%wa,0.0%hi,0.0%si,0.0%st Mem:总共2097372k,使用2080888k,16484k空闲,21464k缓冲 Swap:总计4194296k,已使用380k,存档4193916k,存入1520912k
Catalina.out中没有任何错误消息。
根据Apache的服务器状态,它似乎达到143个请求/秒。 我相信服务器可以处理比他们更多的负载,所以任何有关低默认限制或其他原因,为什么这个设置将最大的暗示将不胜感激。
解决这个问题非常简单:
添加到Proxypass:
BalancerMember ajp://10.176.201.9:8009 keepalive = On ttl = 60
添加到Tomcat的Server.xml中:
连接器端口=“8009”协议=“AJP / 1.3”redirectPort =“8443 connectionTimeout =”60000“
这些改变后,一切都应该工作正常:-)
鉴于Apache日志说明它不能连接到Tomcat(从你的错误日志),它似乎是Tomcat应用程序不能跟上。
当我作为一个大型的Tomcat网站的系统pipe理员工作时,我注意到严重的性能限制,他们不是CPU,而是线程之间的同步问题或查询后端Web服务的延迟。
后者是一个巨大的问题,因为stream行的Java HTTP接口将同时连接到另一个Web服务器的数量默认限制为2(当我发现我的下巴掉线时)。 请参阅http://hc.apache.org/httpclient-3.x/threading.html
您的networking应用程序是否调用任何其他Web服务?
看起来Apache正在获取连接到池中服务器的连接超时,导致它无法为请求提供服务。 您的超时值看起来非常低,间歇性的networking延迟,甚至是需要一点额外时间才能生成的页面,都可能导致服务器退出池。 我会尝试更高的超时和重试值,并可能更高的ping值。
您也可以考虑切换到工人或事件 mpm,prefork mpm通常具有最差的性能。
专用的代理/平衡器软件,如鱿鱼 ,也可能是一个不错的select。
让你的tomcat实例死锁? 我目睹了两个大公司(不同公司)的Tomcat项目遭受了死锁 – 一个是由一个旧版本的第三方库引起的。
你仍然可以直接连接到本地的tomcat实例吗? 那是:
telnet localhost 8080
然后键入:
GET / HTTP/1.0\n \n
(其中\n指的是<enter>键)。
如果没有,那么你的tomcat实例已经死亡或死锁了。 如果它已经死锁,那么是时候使用jstack程序(使用tomcat java程序的PID)获得tomcat java实例的堆栈转储。
PAS,
我没有看到你粘贴的Apache日志上的超时值。 如果是300,请尝试将其更改为1200.我们遇到了同样的问题,并将Apache httpd.conf文件的超时值从300更改为1200。
我面对完全相同的问题。 在发生问题时进行线程转储,您将知道哪个线程正在被阻塞,并且此后也会阻塞其他线程。 同时所有的AJP端口都被使用,最终Apache死亡。 但是这个问题与Apache设置无关。 问题在应用程序(tomcat级别)。
我们回答这个问题,6年后= D
retry=1 timeout=1
那就是问题所在。 超时和重试太短。
超时将认为服务器如果在1秒内没有应答就会死机。 处理一些请求太短(特别是如果你正在做500次/秒的负载testing)。
请注意,一旦服务器发生故障,剩下的两台服务器将收到+ 50%的请求,响应时间将大大增加,直到它们可能立即超时。 典型的级联故障。
你得到503“服务不可用”,因为所有的服务器都被Apache认为是死的,因为它们在负载下的响应速度不够快,因为你的超时太短。
删除这两个设置。 一般来说,从不在任何地方configuration超过5秒的超时时间。