基于新版的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,两边天然就无奈进行通信。遗憾 这样的错配,在软件层面产生了,而在错误信息里也指代不明,应该在后续予以修改。