当前位置: 首页 > Linux

ApacheTomcat-mod_jkconnectiontimeoutcping-cpongtimeout

时间:2023-04-06 04:31:46 Linux

在配置基于新版本Apache-2.4.46+和Tomcat-9.0.45+的新web应用时,使用Mod_jk连接时,使用与之前的版本在每个文件运行后,Apache的JSP文件请求被触发到Mod_jk并转发给Tomcat处理,报错,报错信息是connectionfailedtobackendservice之类的。大致是Apache无法通过mod_jk连接Tomcat的服务。并且单独测试Apache和Tomcat的运行,比如单独请求非JSP文件,或者在Tomcat的8080端口请求相应的JSP文件,都可以正常处理相应的请求。据此判断问题出在mod_jk。什么地方出了错?我们在apache/conf/extra/httpd-jk.conf中打开相应的详细日志记录。\#我们的JK日志级别(trace,debug,info,warn,error)JkLogLeveltrace输出所有步骤的过程记录。日志记录很快返回无法连接到位于::1:8009的服务。问题似乎马上就出现了。由于配置了IPv4和IPv6双栈网络地址,localhost在某些服务级别的解析可能是ipv4address:127.0.0.1或ipv6address::1。可能由于某种原因,主机名localhost在Apache的mod_jk中解析为ipv6地址,而Tomcat程序解析为ipv4地址。相当于mod_jk中的worker配置:apache/conf/extra/workers.properties:worker.balancer.balance_workers=node1worker.node1.reference=worker.templateworker.node1.host=localhost\#worker.node1.host=127.0。0.1worker.node1.port=8009在这里启动后,连接到::1:8009服务,在Tomcat中服务可能启动在127.0.0.1:8009,所以双方只是因为v4或者v6的原因错过了的IP地址。如果是这种情况,似乎很容易解决:1)修改系统的hosts文件,消除主机名localhost的歧义。只用在传统的127.0.0.1上,对于::1地址,也命名为localhost-ipv6;或2)在Apache和Tomcat的配置文件中,不再使用主机名,而是使用清晰具体的IP地址。经过一番折腾,我们排除了localhost的歧义,只指向127.0.0.1,同时在Tomcat/conf/server.xml中:也指定了具体的IPv4地址,所以应该可以正常连接。果然,经过这样的操作,mod_jk不再报错说无法连接::1:8009或127.0.0.1:8009,但还是无法连接!新的错误结果仍然是后端服务连接失败…。处于错误状态或错误端口……和之前不同的是,这次清楚的显示socketconnected,连接已经建立,不再是网络层的问题。对于此错误,cping/cpong期间超时...。已添加。根据这些新的错误信息,继续依靠搜索引擎的帮助来挖掘相关信息。果然,已经有同学遇到了类似的问题。原来是新版本的Tomcat默认启用了新的配置,但是在日志信息中没有给出具体明确的说明。(-R/v2SS)去年Tomcat发生了变化(从版本8.5.51到版本9.0.31),它向AJP连接器引入了一个默认值为true的secretRequired属性(参见文档)。因此,您可以:在AJP连接器和mod_jkor之间添加一个共享密钥,或者将secretRequired="false"添加到AJP连接器。坦白说Tomcat-9.0.31+,secretRequired=true是默认开启的,但是在对应的sampleconfigurationdefaultsettings中并没有提到。错误日志中也没有提到这是由于secretRequired。要解决此问题,需要手动配置:1)在AJP和mod_jk之间添加共享安全密钥,或2)通过在AJP中设置secretRequired=false来禁用此功能。奇怪的是这个AJP默认开启了secretRequired=true,而mod_jk默认没有开启。如果设置了secretRequired=false,那么双方自然就无法通信了。很遗憾这种不匹配发生在软件层面,报错信息中也不清楚,应该在后续更正。