2011-09-01 17 views
2

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

我应该进行配置更改以防止出现此错误吗?

注意:系统并没有承受沉重的负担 - 它只能通过浏览应用程序中的页面,通过一个浏览器自行访问。这表明这个问题可能是一个线程泄漏错误,如果它不是一个错误的配置。我在浏览器中得到的错误是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 
+0

我今天发现这个链接:[mod_jk的后java.net上(HTTP:/ /www.java.net/node/701914),这表明问题是线程池的默认最大大小太小。我将尺寸增加到了50,并且还没有能够重现坠毁。我不相信我不只是推迟了不可避免的崩溃。仍在寻找重新确定的答案,并且可能会提示如何说服自己这种设置对于生产的使用是可以的。 – Ryan

回答

2

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

必须确保GlassFish的最大线程数至少多达阿帕奇。

完整的答案在这里:

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

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

注:设置在Apache中使用线程的方法之一是使用最大属性,像这样:

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

对于Apache Prefork MPM,我认为在GlassFish上设置最大线程池大小可能更合适? asadmin set configs.config.server-config.network-config.thread-pools.thread-pool.http-thread-pool.max-thread-pool-size = 50 – Ryan

+1

澄清:使用Prefork MPM看起来总是有1个每个进程的AJP线程。因此,您需要将Apache MaxClients/ServerLimit更改为更小或使Glassfish池大小更大(默认Apache MaxClients为256)!或者使用ProxyPass disablereuse参数。或者一个小的ProxyPass ttl参数会导致资源释放? – Ryan