CentOS下mod_jk在HTTP正常但HTTPS无法工作的问题排查
我之前在CentOS 7上配置Apache+mod_jk+JBoss时,也碰到过一模一样的HTTPS转发失效问题——HTTP下一切正常,HTTPS就掉链子。结合你给出的worker.properties配置,咱们一步步来排查解决:
检查HTTPS虚拟主机的mod_jk转发配置
最常见的坑就是:只在HTTP的<VirtualHost>块里配置了JkMount,但完全忘了给HTTPS虚拟主机加同样的转发规则。你需要确保在/etc/httpd/conf.d/ssl.conf(或者你自定义的HTTPS虚拟主机配置文件)里,添加对应的mod_jk指令:<VirtualHost *:443> ServerName centos7.test.pl # 你的HTTPS基础配置(SSLCertificateFile、SSLCertificateKeyFile等) # 关键:添加mod_jk转发规则,和HTTP虚拟主机保持一致 JkMount /* sl_jboss-worker # 如果只需要转发特定路径,比如/app/*,可以改成JkMount /app/* sl_jboss-worker </VirtualHost>另外还要确认
httpd.conf里已经全局加载了mod_jk模块,且加载指令在所有虚拟主机配置之前:LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/conf/worker.properties开启mod_jk日志定位细节
如果配置没问题,就需要看日志找线索。在httpd.conf里添加mod_jk的日志配置:JkLogFile /var/log/httpd/mod_jk.log JkLogLevel debug重启Apache(
systemctl restart httpd)后,访问你的HTTPS地址,然后查看/var/log/httpd/mod_jk.log:- 如果日志里完全看不到HTTPS请求的转发记录,说明请求根本没走到mod_jk,大概率是虚拟主机没配置
JkMount; - 如果看到连接JBoss AJP端口的错误,比如
connection refused,那要检查JBoss的AJP连接器状态。
- 如果日志里完全看不到HTTPS请求的转发记录,说明请求根本没走到mod_jk,大概率是虚拟主机没配置
验证JBoss的AJP连接器配置
虽然HTTP下正常,但还是要确认JBoss的AJP连接器有没有正确绑定可访问的地址。打开JBoss的standalone.xml(或domain.xml),找到AJP连接器配置:<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false"> <connector name="ajp" protocol="AJP/1.3" socket-binding="ajp"/> <!-- 其他配置 --> </subsystem>对应的socket-binding要确保是绑定到
0.0.0.0:8009(允许所有IP访问),而不是仅127.0.0.1(不过你HTTP下正常,这个可能性较低,但还是确认下更稳妥)。排查SELinux限制
CentOS 7的SELinux默认会限制Apache发起网络连接,虽然HTTP下能转发,但HTTPS场景下可能触发不同的规则。可以临时关闭SELinux测试:setenforce 0如果关闭后HTTPS转发正常,就需要添加永久的SELinux规则:
setsebool -P httpd_can_network_connect on确认mod_jk编译兼容性
你用的Apache 2.4.6和mod_jk 1.2.42版本是兼容的,但要确保mod_jk是针对Apache 2.4编译的,而不是Apache 2.2。如果之前编译时用了2.2的头文件,可能会在HTTPS场景下出现兼容性问题。可以重新编译mod_jk:# 先安装Apache 2.4的开发依赖 yum install httpd-devel # 解压mod_jk 1.2.42源码包,进入源码目录 ./configure --with-apxs=/usr/bin/apxs make && make install编译完成后重启Apache即可。
内容的提问来源于stack exchange,提问作者Błażej Karwowski

