我有一台运行着带有 apache2 的 JBoss 实例的 Linux 服务器。Apache2 将使用 AJP 连接来反向代理到 JBoss。
我在 apache error.log 中发现了这些消息:
[error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
[error] ajp_read_header: ajp_ilink_receive failed
[error] (120006)APR does not understand this error code: proxy: read response failed from 8.8.8.8:8009 (hostname)
[error] (111)Connection refused: proxy: AJP: attempt to connect to 8.8.8.8:8009 (hostname) failed
[error] ap_proxy_connect_backend disabling worker for (hostname)
[error] proxy: AJP: failed to make connection to backend: hostname
[error] proxy: AJP: disabled connection for (hostname)25
我搜索了一下,但似乎找不到任何相关主题。有人说这种行为可能是由于 apache 与 jboss 配置错误造成的。apache 允许的最大连接数远远大于 jboss,导致 apache 连接超时。
但我知道该应用程序当时并没有被数千个同时连接使用,甚至没有数百个连接,所以我不认为这可能是原因。
有人有想法吗?或者可以告诉我如何调试这个问题吗?
我正在使用这些版本:
- Debian 4.3.5-4 64位
- Apache 版本 2.2.16
- JBOSS 版本 4.2.3.GA
谢谢
答案1
4.2.3 jboss,您应该增加 server.xml 中允许的 ajp 连接数。如果未设置,默认值为 40,太低了。将其提高到比当前最大连接数高 20%。如果您有数百个同时连接,请将其设置为 512 并使用状态控制台进行监控。
答案2
以下是在我的环境中使 jb7.1.1 与 apache mod_jk 通过 ajp 连接协同工作的原因:
独立文件
<profile>
...
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
...
<connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
....
</subsystem>
....
</profile>
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
...
<socket-binding name="ajp" port="8009"/>
...
</socket-binding-group>
顺便问一下,8.8.8.8 这不是谷歌 DNS 吗?
答案3
我相信您所看到的行为可能是由以下 jboss 问题引起的:
https://issues.jboss.org/browse/JBPAPP-366
该问题导致 AJP 线程无限期地阻塞在具有 CLOSED_WAIT 状态的套接字上。当达到 AJP 连接器的“maxProcessors”限制时,jboss 将无法通过 AJP 回答任何请求,从而导致您在 apache 日志中收到错误。
根据票证中的建议,可以通过以下几个步骤解决:
- 从以下位置签出 jbosswebhttp://anonsvn.jboss.org/repos/jbossweb/tags/JBOSSWEB_2_0_1_GA
- 按照 jboss 问题跟踪器评论主题中的建议应用 AjpPatch.patch
- 编辑 build.properties.default 以便 jbossweb 根据您的 jboss AS 版本构建
- 使用 ant 构建项目,并用修补版本替换当前的 jboss-web.deployer/jbossweb