2014-01-07 162 views
4

为了说明这一点,我一直在试图找到一个解决方案。以下只是提供了一些信息的最新链接,但其中没有一个似乎有效。Apache Webserver,Tomcat,AJP,“所有工作人员都处于路由错误状态”

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 

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

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

我的方案中的所有主机都是健壮的生产环境中的VM,每个主机都有多个内核。

阿帕奇版本:

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驱动程序本身连接到Oracle的应用,v11.2.0.3.0。

的事情,我已经观察到:

  1. 它不会出现在Tomcat服务器是越来越有来自Apache的请求溢出。这来自对日志活动的观察,以及通过Apache Web服务器服务器状态数据进行验证,并通过jconsole通过线程活动进行支持。 (我从来没有看到执行线程的数量增加,接近我设置的上限)。这是一个内部应用程序,服务大约400个用户,其中大多数用户不在同一时间;所以负载不应该是问题。
  2. 我似乎没有任何线程死锁问题......当使用jconsole远程监视Tomcat实例时,我查看ajp-apr-8009-exec-#线程来确认这一点,并且大多数都处于等待状态,而一些我可以看到积极处理。
  3. 我们有一些长时间运行的请求 - 有些时候,有时会超过上面列出的600s超时。这是我目前正在探索的一个领域;请求长度的原因通常是在非常大的数据存储上进行联合搜索,这只需要花费一些时间,但通常会在几秒钟内返回。当需要更长的时间时,这通常是由于用户的关键字搜索结构不完善导致Oracle在阻止结果时阻塞了相当长的一段时间。目前我正在重构它,以便它运行在与request/apr exec线程不同的线程中,并且如果执行时间超过280s(4分40秒),它将终止线程并向用户返回错误;这样我可以排除Tomcat花费太长时间来处理请求。

至于我现在正在尝试解决的问题,我觉得我已经耗尽了配置能力(其中包括在线搜索每种可能的解决方案,因为我是一个贸易软件人员,而不是基础设施)..所以我通过交换平台尝试了不同的方法:我在Linux机器上运行Apache Web服务器,并且使用DNS轮循机制,部分用户通过Linux而不是Windows进行路由。这似乎没有帮助,但Tomcat的工作人员仍然在同一个Windows机器上运行。

我目前也在Linux机器上获得了Tomcat应用程序本身,并且当我拥有该稳定版本(由于假定有关Windows是该应用程序将承载的唯一平台,所以需要进行少量代码更改)我会将其作为工作人员添加以查看该特定实例是否遇到相同的问题。

如果没有别的,我想确认我对长执行请求的怀疑是正确的。我试过各种配置更改无济于事。

+0

欢迎来到Stack Overflow。正如你提到的那样,你的问题可以在服务器故障上收集更多的答案。祝你好运。 –

回答

0

的错误是在这里的apache的error_log ...

我们有一个ELB与600在阿帕奇的面前超时... tomcat的设置为600

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

如果Apache不显式地配置其超时是例如60秒

超时600在httpd.conf

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

相关问题