我们在 Apache 后面有一个 Tomcat 实例。我们使用 mod_jk。
模块配置是:
LoadModule jk_module modules/mod_jk.so
<IfModule mod_jk.c>
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
</IfModule>
这里是 VirtualHost 配置:
<VirtualHost *:9090>
...
JkMount /Web/* worker-Web
JkMount /Web worker-Web
</VirtualHost>
worker.properties 文件:
worker.list=worker-Web
worker.worker-omiapWeb.port=8209
worker.worker-omiapWeb.host=localhost
worker.worker-omiapWeb.type=ajp13
此配置对于 jsp、html 非常有用...但我们有一个 JNLP 文件:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0" codebase="$$codebase">
<information>
<title>Gestor Impresiones</title>
<vendor>.</vendor>
</information>
<resources locale="es">
<jar href="gestorImpresiones.jar"/>
<jar href="jasperreports-1.2.5.jar"/>
<jar href="commons-httpclient-3.1-beta1.jar"/>
<jar href="commons-logging-1.1.jar"/>
<jar href="commons-codec-1.3.jar"/>
<jar href="commons-javaflow-20060411.jar"/>
<jar href="commons-collections-3.1.jar"/>
<jar href="poi-3.0.1-FINAL-20070705.jar"/>
<jar href="jdic.jar"/>
</resources>
<resources os="Windows">
<jar href="windows/jdic_stub.jar"/>
<nativelib href="windows/jdic-native.jar"/>
</resources>
<resources os="Linux">
<jar href="linux/jdic_stub.jar"/>
<nativelib href="linux/jdic-native.jar"/>
</resources>
<resources locale="es">
<j2se version="1.3+" href="http://java.sun.com/products/autodl/j2se"/>
</resources>
<security>
<all-permissions/>
</security>
<application-desc main-class="stacks.printing.cliente.GestorImpresionLauncher"/>
</jnlp>
问题是下载 JNLP 资源会随机失败(如果连接速度较差,则会失败更多)。
如果我们直接访问 Tomcat,一切都正常。
有任何想法吗?
編輯 1:
Apache 日志错误:
[Thu Jul 01 09:51:45 2010] [868:5096] [info] jk_connect.c (566): connect to 127.0.0.1:8209 failed (errno=61)
[Thu Jul 01 09:51:45 2010] [868:5096] [info] jk_ajp_common.c (869): Failed opening socket to (127.0.0.1:8209) (errno=61)
[Thu Jul 01 09:51:45 2010] [868:5096] [error] jk_ajp_common.c (1359): (worker-omiapWeb) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=61)
[Thu Jul 01 09:51:45 2010] [868:5096] [info] jk_ajp_common.c (2186): (worker-omiapWeb) sending request to tomcat failed (recoverable), because of error during request sending (attempt=2)
[Thu Jul 01 09:51:45 2010] [868:5096] [error] jk_ajp_common.c (2204): (worker-omiapWeb) Connecting to tomcat failed. Tomcat is probably not started or is listening on the wrong port
[Thu Jul 01 09:51:45 2010] [868:5096] [info] mod_jk.c (2364): Service error=-3 for worker=worker-omiapWeb
編輯2:
server.xml AJP 部分:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8209"
maxThreads="300" connectionTimeout="600000"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
答案1
为什么要从 tomcat 提供 JNLP 应用程序?WebStart 使用纯 HTTP GET 请求来访问 JNLP 文件,然后访问 .jar 文件。您可以将这些文件放在 Tomcat 之外,让 Apache 独自完成工作。
答案2
尝试将你的工作超时设置为高于默认值:
worker.worker-omiapWeb.socket_timeout=60
worker.worker-omiapWeb.connect_timeout=2000
worker.worker-omiapWeb.prepost_timeout=1000
worker.worker-omiapWeb.reply_timeout=30000
这包含在您的 worker.properties 文件中。您可能需要对其中一个或多个进行更高级的操作 - 我们需要查看您的 apache 日志文件,以确定哪一个导致了您的问题。
答案3
您可能还想发布 AJP 连接器的 server.xml 部分。一种可能性是 Tomcat 端的连接器没有足够的容量(maxThreads 和超时)来处理 Apache 发送的连接数。