Apache Webserver,Tomcat,AJP,“所有工作人员都处于错误状态”

时间:2014-01-07 22:09:34

标签: apache tomcat load-balancing ajp mod-proxy-balancer

作为序言,我一直在互联网上寻找解决方案。以下是提供一些信息的最新链接,但这些信息似乎都没有起作用。

https://serverfault.com/questions/19947/apachetomcat-having-problems-communicating-unclear-error-messages-bringing-do

Tomcat stops responding to Apache

尽管我在下面概述了许多配置更改,但我无法阻止错误,因此会出现在日志中:

[Tue Jan 07 14:56:12.158345 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] (70007)The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header
[Tue Jan 07 14:56:12.158409 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] [client 10.4.65.146:58551] AH00992: ajp_read_header: ajp_ilink_receive failed, referer: http://xxxx/yyy/
[Tue Jan 07 14:56:12.158430 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] (70007)The timeout specified has expired: [client 10.4.65.146:58551] AH00878: read response failed from 10.4.3.33:8009 (tomcatworkerX), referer: http://xxxx/yyy/
[Tue Jan 07 14:56:12.229559 2014] [proxy_balancer:error] [pid 12094:tid 140002932012800] [client 10.4.230.138:57407] AH01167: balancer://lb: All workers are in error state for route (tomcatworkerX), referer: http://xxxx/yyy/zzz

下载的用户会看到“服务器不可用”屏幕,但连接会在几分钟后恢复。然而,有时相同的服务器连接会多次上/下;这可能是由于用户行为相同(我使用粘性会话),但我无法确认这一点。

我的配置是我在Windows环境中运行一个Apache Webserver实例,通过AJP配置了4个Tomcat worker。目前,所有Tomcat工作者都在Windows下托管在不同的主机上。

我的方案中的所有主机都是强大的生产环境中的虚拟机,每个主机都有多个核心。

Apache版本:

Server version: Apache/2.2.22 (Win32)

Tomcat是版本7.0.29

每个BalancerMember都有以下配置参数:

keepalive=On timeout=600 ttl=600

当前使用本机连接器的每个Tomcat实例(org.apache.coyote.ajp.AjpAprProtocol)。

连接器配置:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads="450" connectionTimeout="600000" />

应用程序本身通过Oracle ojdbc15_g JDBC驱动程序v11.2.0.3.0连接到Oracle。

我观察到的事情:

  1. 似乎Tomcat服务器没有因Apache的请求而被溢出。这是通过观察日志活动,以及通过Apache Web服务器服务器状态数据进行验证,通过jconsole通过线程活动来支持。 (我从来没有看到执行线程的数量增加到接近上面设置的限制)。这是一个内部应用程序,为大约400名用户提供服务,其中大多数用户不在同一时间;所以负载不应该是问题。
  2. 我似乎没有任何线程死锁问题...使用jconsole远程监视Tomcat实例时,我查看ajp-apr-8009-exec-#threads来确认这一点,而且大多数都在等待状态,而有些我可以看到积极处理。
  3. 我们确实有一些长时间运行的请求 - 有些时候会超过我在上面概述的超过600秒的超时时间。这是我现在正在探索的一个领域;请求长度的原因通常是在非常大的数据存储上进行联合搜索,这需要花费时间,但通常在几秒钟内返回。当需要更长时间时,通常是由于用户构造不良的关键字搜索导致Oracle在构建结果时阻塞了相当长的一段时间。目前我正在重构这个,以便它在请求/ apr exec线程的单独线程中运行,如果执行它需要超过280秒(4分40秒),它将终止线程并将错误返回给用户;通过这种方式,我可以排除Tomcat处理请求的时间过长。
  4. 至于我现在正在尝试解决的问题,我觉得我的配置能力已经耗尽(其中包括在线搜索每个可能的解决方案,因为我是一个按交易而不是基础设施的软件人员)。所以我通过切换平台尝试不同的技巧:我在Linux机器上运行Apache Webserver,并使用DNS循环,一部分用户通过Linux而不是Windows进行路由。这似乎没有帮助,但Tomcat工作者仍然在相同的Windows机器上运行。

    我目前正在Linux机器上运行Tomcat应用程序,当我有稳定时(由于假设Windows是应用程序将托管在其上的唯一平台,因此需要进行一些小的代码更改)将添加为工作者,以查看该特定实例是否遇到相同的问题。

    如果不出意外,我想确认我对长期执行请求的怀疑是正确的道路。我尝试了各种配置更改无济于事。

1 个答案:

答案 0 :(得分:0)

这个错误出现在这里的apache error_log中......

我们在apache面前有一个超时为600的ELB ...... tomcat设置为超时600

我们的错误是网络服务器超时

如果未明确配置apache,则超时为60秒

例如httpd.conf中的TimeOut 600

apache webserver和tomcat实例之间的超时可能会在长时间运行的会话中超时......例如,长时间的api调用。