1

我们正在将生产环境转移到客户的数据中心。目前,为了解释这个场景,我们有一个 Apache 负载均衡器,它对托管 2 个 Grails 应用程序的 2 个 Apache Tomcat 应用程序服务器的请求进行负载均衡。我会很感激任何帮助!

总而言之,我们的设置是: - 充当负载均衡器的 Apache HTTP 服务器

  • 2 台 Tomcat 服务器(节点 A 和节点 B)

  • 我们在每个 Tomcat 服务器上托管了两个 Java/Grails 应用程序。在我们当前的环境中,我们通过负载均衡器将 hessian 请求从我们的一个 grails 应用程序发送到另一个 grails 应用程序。这完美地工作。在我们要迁移到的环境中,这是失败的。

    我们已经能够验证所有防火墙和安全包都已关闭。我们还能够验证每次该 hessian 调用失败时负载均衡器访问日志中是否存在错误 (/var/log/httpd/access_log):

10.30.95.51 - - [19/Jun/2014:11:55:13 -0400]“POST /Application/hessian/RemoteTicketService HTTP/1.1”500 8067“-”“Java/1.6.0_30”

我继续执行 tcpdump,我能够确定 Hessian 存在 Grails 应用程序错误 - 有人有什么想法吗?:

L6DàL6<83>¢HTTP/1.1 500 内部服务器错误^M 日期:2014 年 6 月 20 日星期五 14:40:08 GMT^M 服务器:Apache/2.2.15 (Red Hat)^M 连接:close^M 传输编码: chunked^M Content-Type: text/html;charset=UTF-8^M ^M 1f83^M Grails Runtime Exception .message {border: 1px solid black; 填充:10px;背景颜色:#E9E9E9; 边距:30px;} .header{ 边距:30px; } .stack { 边框:1px 纯黑色;填充:5px;溢出:自动;高度:300px;} .snippet { 填充:5px; 背景颜色:白色;边框:1px纯黑色;边距:3px;字体家族:信使;}

看起来您遇到了错误,对此 消息感到抱歉:在 -1 的粗麻布输入中预期 'H'/'C' (Hessian 2.0) 或 'c' (Hessian 1.0)
原因:Hessian 骨架调用失败;嵌套异常是 java.io.IOException: Expected 'H'/'C' (Hessian 2.0) or 'c' (Hessian 1.0) in hessian input at -1 Class: Unknown
At Line: [-1]
Code Snippet:

4

1 回答 1

1

这原来是 Apache/2.2.15 上的 mod_jk 模块 1.2.39 的问题。我们将 mod_jk 模块换成了 1.2.37 版本,一切正常。使用 tcpdump 和一个基本的 hessian java 项目,我们能够通过在我们的 hessian 工厂上将“chunked post”设置为 false 来确认问题已得到解决。不幸的是,我们显然无法在我们的项目库/依赖项中执行此代码更改,但我们发现在 mod_jk 1.2.39 中分块 HTTP 请求的转发被破坏了。mod_jk 1.2.40 修复了这个错误,它也不会影响我们在 1.2.37 中的环境。

http://tomcat.apache.org/connectors-doc/miscellaneous/changelog.html

于 2014-07-09T15:47:03.093 回答