首先,我一直在互联网上试图找到解决方案。以下只是提供了一些信息的最新链接,但似乎没有一个有效。
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
下线的用户会看到“服务器不可用”屏幕,但几分钟后连接恢复。然而,有时同一个服务器连接会多次启动/关闭;这可能是由于相同的用户行为(我使用粘性 session ),但我无法确认这一点。
我的配置是我有一个在 Windows 环境中运行的 Apache Webserver 实例,通过 AJP 配置了 4 个 Tomcat 工作器。目前,所有 Tomcat 工作程序都托管在 Windows 下的不同主机上。
我的场景中的所有主机都是健壮的生产环境中的 VM,每个主机都有多个内核。
Apache 版本:
Server version: Apache/2.2.22 (Win32)
Tomcat 是 7.0.29 版本
每个 BalancerMember 都有这些配置参数:
keepalive=On timeout=600 ttl=600
当前使用 native 连接器(org.apache.coyote.ajp.AjpAprProtocol)的每个Tomcat实例。
连接器配置:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads="450" connectionTimeout="600000" />
应用程序本身通过 Oracle ojdbc15_g JDBC 驱动程序 v11.2.0.3.0 连接到 Oracle。
我观察到的事情:
至于我现在正在做什么来尝试解决它,我觉得我已经用尽了我的配置能力(包括在网上搜索每个可能的解决方案,因为我是一个软件专家,而不是基础设施)..所以我我正在通过切换平台尝试不同的策略:我在 Linux 机器上运行了 Apache Webserver,并使用 DNS 轮询,一部分用户通过 Linux 而不是 Windows 进行路由。这似乎没有帮助,但 Tomcat 工作人员仍在相同的 Windows 机器上运行。
我目前也在 Linux 机器上安装 Tomcat 应用程序本身,当我稳定时(由于假设 Windows 是应用程序将托管的唯一平台,因此需要进行一些小的代码更改)我会补充说作为工作人员查看该特定实例是否遇到相同的问题。
如果不出意外,我想确认我对长期执行请求的怀疑是正确的。我尝试了各种配置更改都无济于事。
最佳答案
该错误位于此处的 apache error_log 中...
我们在 apache 前面有一个超时为 600 的 ELB ......
tomcat 设置为 600 超时
我们的错误是网络服务器超时
如果未明确配置 apache,则其超时时间为 60 秒
例如,httpd.conf 中的超时 600
apache 网络服务器和 tomcat 实例之间的超时可能会在长时间运行的 session 中超时……例如一个很长的 api 调用。
关于Apache 网络服务器、Tomcat、AJP、 "All workers are in error state for route",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20982988/