Apache mod_proxy_ajp与GlassFish线程池忙

时间:2011-09-01 17:17:56

标签: apache glassfish-3 mod-proxy

我使用Apache和GlassFish上的默认值通过mod_proxy_ajp向Apache 2.2.15代理了对GlassFish 3.1.1的请求。设置似乎在很短的时间内正常工作然后我将在GlassFish日志中收到线程池忙错误消息,然后在Apache日志中出现超时错误,并且在重新启动GlassFish之前应用程序不再工作。

我是否应该更改配置以防止出现此错误?

注意:系统负载不重 - 只需通过浏览应用程序中的页面,我就可以通过一个浏览器访问它。这表明如果不是错误配置,问题可能是线程泄漏错误。我在浏览器中遇到的错误是500:内部服务器错误。

GlassFish日志中的错误是:

SEVERE|glassfish3.1.1|org.apache.tomcat.util.threads.ThreadPool|_ThreadID=17;_ThreadName=Thread-2;|threadpool.busy

Apache日志中的错误是:

[error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header

我在Apache中的代理配置是:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
ProxyPass / ajp://mydomain:8009/
ProxyPassReverse / ajp://mydomain:8009/

在GlassFish中,我只是在安装后运行以下命令:

asadmin create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs server apache-proxy
asadmin set configs.config.server-config.network-config.network-listeners.network-listener.apache-proxy.jk-enabled=true

1 个答案:

答案 0 :(得分:2)

我在java.net上的GlassFish论坛上问过这个问题并得到了效果的回应:

  

您必须确保GlassFish的最大线程数至少与Apache一样多。

完整答案:

http://www.java.net/forum/topic/glassfish/glassfish/jkenabled-thread-leak

这似乎是一个合理的答案,所以我在这里张贴它是为了别人的利益。

注意:设置Apache上使用的线程的一种方法是使用 max 属性,如下所示:

ProxyPass / ajp://mydomain:8009/ max=20