4

作为序言,我一直在互联网上试图找到解决方案。以下只是提供了一些信息的最新链接,但似乎都没有工作。

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

Tomcat 停止响应 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 工作人员。目前,所有 Tomcat 工作人员都托管在 Windows 下的不同主机上。

我的场景中的所有主机都是健壮的生产环境中的虚拟机,每个主机都有多个内核。

阿帕奇版本:

Server version: Apache/2.2.22 (Win32)

Tomcat 是 7.0.29 版本

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

keepalive=On timeout=600 ttl=600

当前使用本机连接器 (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。

我观察到的事情:

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

至于我现在正在做些什么来尝试解决它,我觉得我已经用尽了我的配置能力(包括在网上搜索所有可能的解决方案,因为我是一个软件专家,而不是基础设施)..所以我我正在通过切换平台尝试不同的策略:我在 Linux 机器上运行了 Apache Webserver,并且使用 DNS 循环,部分用户通过 Linux 而不是 Windows 进行路由。这似乎没有帮助,但 Tomcat 工作人员仍在相同的 Windows 机器上运行。

我目前也在 Linux 机器上安装 Tomcat 应用程序本身,当我有稳定的时候(由于假设 Windows 是该应用程序托管的唯一平台,一些小的代码更改是必要的)我会补充一点作为工作人员,看看该特定实例是否遇到相同的问题。

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

4

1 回答 1

1

该错误在此处的 apache error_log 中...

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

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

如果 apache 没有明确配置,它的超时时间是 60 秒

例如 httpd.conf 中的 TimeOut 600

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

于 2015-07-09T19:15:37.950 回答