Apache 网络服务器、Tomcat、AJP、 "All workers are in error state for route"

标签 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

下线的用户会看到“服务器不可用”屏幕,但几分钟后连接恢复。然而,有时同一个服务器连接会多次启动/关闭;这可能是由于相同的用户行为(我使用粘性 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。

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

  • 至于我现在正在做什么来尝试解决它,我觉得我已经用尽了我的配置能力(包括在网上搜索每个可能的解决方案,因为我是一个软件专家,而不是基础设施)..所以我我正在通过切换平台尝试不同的策略:我在 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/

    相关文章:

    redis - 我可以只使用 2 个 Redis/Sentinel 服务器来管理我的 2 个服务器设置上的故障转移吗?

    java - 当 Java 应用程序位于负载均衡器后面时,在某些 URL 上强制使用 SSL

    apache - 负载测试我们的 Web 应用程序时出现奇怪的 Jersey 异常

    tomcat - 在 Centos 上运行多个 tomcat 实例

    eclipse - Maven 目标,编译并部署到服务器

    spring - 将 spring boot war 生成的文件部署到 tomcat 服务器,TemplateResolver 未定位文件

    signalR 协商请求返回原始 url 作为响应而不是覆盖 url

    php - Apache 和 Terminal 在 Mac OS 10.8 上运行 2 个不同的 php 构建

    php - 上传 IO 错误 - 与 Apache 用户相关?

    php - 在 .htaccess 中为 php 文件创建重写规则