关于java:Apache-Tomcat-modjk-连接超时cpingcpong-timeout

8次阅读

共计 2118 个字符,预计需要花费 6 分钟才能阅读完成。

基于新版的 Apache-2.4.46+ 和 Tomcat-9.0.45+ 配置一例新的 Web 利用时,应用 Mod_jk 进行连贯时,应用与之前版本雷同的配置文件,各自运行起来后,Apache 的 JSP 文件申请触发到 Mod_jk 并进一步地前传给 Tomcat 解决时,开始报错,报错信息是 connection failed to backend service 之类。

大抵是 Apache 无奈通过 mod_jk 连贯到 Tomcat 的服务。而独自测试 Apache 的运行和 Tomcat 的运行,比方独自申请非 JSP 文件,或者在 Tomcat 的 8080 端口申请相应的 JSP 文件,均可能失常解决相应的申请。基于此,咱们判断问题就出在 mod_jk 上,到底哪里出错了呢?

咱们在 apache/conf/extra/httpd-jk.conf 中关上相应的具体日志记录。

\# Our JK log level (trace,debug,info,warn,error)
JkLogLevel trace

输入所有步骤的过程记录。日志记录很快反馈回来,是无奈连贯到 ::1:8009 这个服务。

问题仿佛一下子显现出来了。因为配置了 IPv4 和 IPv6 双栈网络地址,在一些服务层面对 localhost 的解析,可能是 ipv4 地址:127.0.0.1 或者 ipv6 地址 ::1。可能因为某种原因,localhost 这个 hostname 在 Apache 的 mod_jk 中解析出是 ipv6 地址,而 Tomcat 的程序中则解析出 ipv4 地址。

相当于是 mod_jk 中的 worker 配置中:apache/conf/extra/workers.properties:

worker.balancer.balance_workers=node1
worker.node1.reference=worker.template
worker.node1.host=localhost
\#worker.node1.host=127.0.0.1
worker.node1.port=8009

这里启动后去连贯 ::1:8009 服务,而在 Tomcat 中服务可能启动在 127.0.0.1:8009 上,于是两边就这么因为 ip 地址的 v4 或者 v6 而错过了。问题若是如此,仿佛也好解决:1)批改零碎的 hosts 文件,批改打消主机名 localhost 的歧义,只用在传统的 127.0.0.1 上,而针对 ::1 地址,另外命名为 localhost-ipv6;或者 2)在 Apache 和 Tomcat 的配置文件中,不再应用主机名,都应用明确而具体的 IP 地址。通过一番折腾,咱们打消了 localhost 的歧义,只指向 127.0.0.1, 同时在 Tomcat/conf/server.xml 中:

<Connector protocol=”AJP/1.3″

port=”8009″

address=”127.0.0.1″
redirectPort=”8443″/>

也做了具体的 IPv4 地址的指定,这样按预期应该是可能连通的。
果然,通过这么一番操作,mod_jk 不再报错说无奈连贯 ::1:8009 或者 127.0.0.1:8009 的谬误,但仍然无奈进行连贯!新的谬误后果仍然是 connection failed to backend service…. in error state or wrong port….

与此前所不同的是,这次明确显示出了 socket connected,连贯曾经被创立,不再是网络层的问题。这次的谬误,减少了 timeout during cping/cpong ….,依据这些新的报错信息,持续依附搜索引擎的帮忙,开掘相干信息。
果然,曾经有同学遇到相似问题,原来是因为 新版的 Tomcat 默认启用了新的配置,但未能在日志信息中给出具体而明确的批示。

(-R/v2SS) There was a change in Tomcat last year (from version 8.5.51 and version 9.0.31), which introduced a secretRequired attribute to the AJP connector with a default of true (cf. documentation). Hence you can either:

add a shared secret between the AJP connector and mod_jk

or add secretRequired=”false” to the AJP connector.

直白地说,Tomcat-9.0.31+,默认启用 secretRequired=true, 但在相应的样例配置默认设置中却没有提及。而且在谬误日志中也没有提及是因为 secretRequired 的问题。要解决这个问题,就须要手工配置:1)减少一个共享的平安 key 在 AJP 和 mod_jk 之间,或者 2)通过在 AJP 设置 secretRequired=false,停用这个性能。

奇怪的是这个 AJP 默认启用了 secretRequired=true, 而 mod_jk 则是默认不启用,设置 secretRequired=false,两边天然就无奈进行通信。遗憾 这样的错配,在软件层面产生了,而在错误信息里也指代不明,应该在后续予以修改。

正文完
 0