我使用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
答案 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