我们有一个 JBoss 生产环境,Java 应用程序正在其上运行。我们已配置 Apache 服务器 (DMZ) 以将流量路由到 JBoss 生产服务器并提高安全性。我们使用 Apache 的 mod_jk 模块路由到生产环境和 Apache 版本 2.2。几个月来它运行良好,但有一段时间我们遇到了此错误:
Bad Gateway
The proxy server received an invalid response from upstream server.
我在 Apache 上的 worker.property 是:
worker.list=ws
worker.ws.port=8009
worker.ws.host=192.168.56.102
worker.ws.type=ajp13
我的 httpd.conf 文件为该工作者提供了以下虚拟主机:
<virtualhost *:443>
ErrorLog "logs/dmz-error.log"
CustomLog "logs/dmz-access.log" common
JkMount /ws/ ws
JkMount /* ws
JkLogFile logs/mod_jk_prod.log
JkLogLevel error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories
JkRequestLogFormat "%w %V %T"
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
</virtualhost>
JBoss 运行在默认配置下。该系统运行的是旧版 Apache,配置和路由相同。但我们需要更换 Apache 机器,还被要求将 Apache 升级到 2.2 版本。我们面临这个问题已经将近 2 个月了。Mod_jk 日志显示以下错误:
[Tue Sep 23 11:52:01 2014][1392:1900] [error] ajp_get_reply::jk_ajp_common.c (2126): (ws) Tomcat is down or refused connection. No response has been sent to the client (yet)
[Tue Sep 23 11:52:01 2014][1392:4028] [error] ajp_get_reply::jk_ajp_common.c (2126): (ws) Tomcat is down or refused connection. No response has been sent to the client (yet)
我们找不到任何解决方案。当显示此错误时,刷新页面几次即可解决该问题,但有时我们无法访问我们的应用程序。我如何知道此错误的真正原因?请有人帮忙。
答案1
这可能是因为防火墙切断了 mod_jk 和 JBoss 之间的 ajp13 连接。不过,这不是防火墙的问题,而可能是 mod_jk 的 worker.properties 和 JBoss 中的配置默认值造成的。
在 中workers.properties
添加:
worker.list=ws
worker.ws.port=8009
worker.ws.host=192.168.56.102
worker.ws.type=ajp13
worker.ws.socket_keepalive=True
worker.ws.connection_pool_timeout=600
"socket_keepalive"
将通过 ajp13 会话向 JBoss 发送 keepalive 消息。
"connection_pool_timeout"
将在 10 分钟不活动后关闭 ajp13 会话。
在 server.xml 中的 JBoss ajp13 连接器部分(JBoss 4,5,6)
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
connectionTimeout="600000" />