我在JBoss上运行的servlet出现间歇性问题,Apache通过mod_proxy_ajp.so将所有请求转发给它。
有时,对于REST请求,我从Apache获得503错误。发生这种情况时,Apache error_log就会出现这种情况:
[Mon Oct 12 09:10:19 2009] [error] (32)Broken pipe: ajp_ilink_send(): send failed
[Mon Oct 12 09:10:19 2009] [error] (32)Broken pipe: proxy: send failed to 127.0.0.1:8009 (localhost)
尝试失败后,再次开始工作。
我用谷歌搜索了一些,发现我不是唯一一个遇到这个问题的人。我发现的唯一解决方案是确保Apache在JBoss之后启动(我在重启JBoss后重新启动Apache)。
这个问题的奇怪之处在于,在这个JBoss中运行了其他servlet,我没有问题。
servlet是基于CXF JAX-RS的。
Apache是2.2.6。
答案 0 :(得分:1)
使用AJP协议时,必须非常小心,确保通信的两端(即Apache和Tomcat)配置了相同的参数。这是因为AJP使用持久的有状态连接,并且双方都需要对连接生命周期有相同的期望。
我建议给relevant Tomcat docs a good read。您可能必须修改Apache的mod_proxy_ajp
配置或Tomcat的AJP连接器配置,或两者都修改,以便它们匹配。如果配置甚至略有不同,AJP的表现绝对很糟糕。
答案 1 :(得分:1)
我遇到了同样的问题,但也没有找到原因。如果可接受的轻微性能损失,一个简单的解决方案是转储mod_proxy_ajp
以支持mod_proxy_http
。至少对于每秒最多100个页面加载的网站来说,没有任何问题。
答案 2 :(得分:1)
我发现this config generator在配置AJP连接时很有帮助。从生成的配置开始并阅读相关文档是有益的。
(您可以通过执行列出已编译模块的apachectl -l
来确定“Apache mpm”参数。)