Apache Tomcat 9搭配mod_jk负载均衡故障排查请求
问题
尝试用Tomcat 9搭配mod_jk实现负载均衡失败,相同配置和端口在Tomcat 8上能正常运行。Tomcat 9跳转对应端口时卡在连接状态,始终无法完成跳转。查看Apache 2.2的mod_jk.log和error.log未发现错误。
环境信息
- Apache HttpServer 2.2
- Mod_jk 1.2.40
配置文件
workers.properties
worker.instance1.type=ajp13 worker.instance1.host=127.0.0.1 worker.instance1.port=7009 worker.instance1.lbfactor=1 worker.instance1.connection_pool_timeout=600 worker.instance1.socket_timeout=300 # Instance2 worker.instance2.type=ajp13 worker.instance2.host=127.0.0.1 worker.instance2.port=6009 worker.instance2.lbfactor=1 worker.instance2.connection_pool_timeout=600 worker.instance2.socket_timeout=300 worker.loadbalancer.type=lb worker.loadbalancer.balance_workers=instance1,instance2 worker.loadbalancer.sticky_session=1 worker.list=loadbalancer,jkstatus worker.jkstatus.type=status
端口7009对应的server.xml片段
<!-- Define an AJP 1.3 Connector on port 7009 --> <Connector port="7009" protocol="AJP/1.3" redirectPort="8043" /> <Engine name="Catalina" defaultHost="127.0.0.1" jvmRoute="instance2">
端口6009对应的server.xml片段
<!-- Define an AJP 1.3 Connector on port 6009--> <Connector port="6009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="127.0.0.1" jvmRoute="instance1">
解决建议
- 检查Tomcat 9的AJP连接器密钥配置:Tomcat 9默认开启
secretRequired="true",而Tomcat 8默认关闭。若mod_jk未配置对应密钥,会导致连接失败。可在Tomcat的AJP Connector标签临时添加secretRequired="false"测试,或配置secret="自定义密钥",同时在workers.properties中给对应worker添加worker.instance1.secret=自定义密钥。 - 升级mod_jk版本:当前使用的mod_jk 1.2.40版本较老,存在与Tomcat 9的AJP协议兼容问题,建议升级至1.2.48及以上版本。
- 查看Tomcat 9自身日志:重点检查
catalina.log和localhost.log,尤其是启动阶段和连接请求时的日志,可能存在AJP连接相关的错误信息(如密钥不匹配、协议版本冲突)。 - 验证端口监听状态:用
netstat -ano(Windows)或ss -tulpn(Linux)确认7009、6009端口确实被Tomcat 9进程监听,排除端口被占用或AJP连接器未正常启动的情况。 - 对齐jvmRoute与worker名称:当前配置中instance1对应端口7009,但server.xml里7009的jvmRoute是instance2,6009对应instance1,虽逻辑可行但易混淆,建议调整为worker名称与jvmRoute一一对应,便于排查问题。
- 调整mod_jk超时参数:尝试增大
socket_timeout和connection_pool_timeout的值(如socket_timeout设为600),排查是否因超时时间过短导致连接中断。
内容的提问来源于stack exchange,提问作者alexkidd
相关产品推荐
相关产品推荐

