我已经建立了一个非常简单的 Apache + Glassfish 集群配置。
如果我创建并使用使用默认 http-listener-1 的监听器,它可以正常工作。
但是,如果我切换到使用 http-listener-2 的安全侦听器,则连接虽然可以建立,但随后会断开,用户会收到 502 Bad Gateway 错误,并且 mod_jk.log 中会出现此消息
[Wed Dec 04 16:17:55.905 2019] [6957:139970911750336] [debug] jk_open_socket::jk_connect.c (674): socket TCP_NODELAY set to On
[Wed Dec 04 16:17:55.905 2019] [6957:139970911750336] [debug] jk_open_socket::jk_connect.c (711): socket SO_KEEPALIVE set to On
[Wed Dec 04 16:17:55.905 2019] [6957:139970911750336] [debug] jk_open_socket::jk_connect.c (763): timeout 300 set for socket=16
[Wed Dec 04 16:17:55.905 2019] [6957:139970911750336] [debug] jk_open_socket::jk_connect.c (798): trying to connect socket 16 to 10.0.10.4:28010
[Wed Dec 04 16:17:55.906 2019] [6957:139970911750336] [debug] jk_open_socket::jk_connect.c (824): socket 16 [10.0.30.4:39278 -> 10.0.10.4:28010] connected
other log entries in between....
[Wed Dec 04 16:17:55.907 2019] [6957:139970911750336] [debug] ajp_send_request::jk_ajp_common.c (1779): (worker1) request body to send 0 - request body to resend 0
[Wed Dec 04 16:17:55.909 2019] [6957:139970911750336] [debug] jk_shutdown_socket::jk_connect.c (931): About to shutdown socket 16 [10.0.30.4:39278 -> 10.0.10.4:28010]
[Wed Dec 04 16:17:55.909 2019] [6957:139970911750336] [debug] jk_is_input_event::jk_connect.c (1410): error event during poll on socket 16 [10.0.30.4:39278 -> 10.0.10.4:28010] (event=16)
[Wed Dec 04 16:17:55.909 2019] [6957:139970911750336] [debug] jk_shutdown_socket::jk_connect.c (1015): Shutdown socket 16 [10.0.30.4:39278 -> 10.0.10.4:28010] and read 0 lingering bytes in 0 sec.
[Wed Dec 04 16:17:55.909 2019] [6957:139970911750336] [info] ajp_connection_tcp_get_message::jk_ajp_common.c (1339): (worker1) can't receive the response header message from tomcat, tomcat (10.0.10.4:28010) has forced a connection close for socket 16
配置非常标准,唯一的区别是我使用的是由我的内部认证机构构建的个人证书。该证书已成功添加到密钥库,如果我直接通过端口 8181 访问 Web 应用程序,它可以正常工作(但会出现一些警告),我可以检查我的证书。
这是 https.conf 部分
# Sample app
JkMount /sample loadbalancer
JkMount /sample/* loadbalancer
工人属性
worker.list=worker1,loadbalancer
# default properties for workers
worker.template.type=ajp13
worker.template.port=28010
worker.template.lbfactor=50
worker.template.connection_pool_timeout=600
worker.template.socket_keepalive=1
worker.template.socket_timeout=300
# properties for worker1
worker.worker1.reference=worker.template
worker.worker1.host=myhost.com
# properties for loadbalancer
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1
这里是 Glassfish 上的 jk 连接器,如您所见,它位于端口 28010 上,我已确保它是打开的。
答案1
在花了一些时间调查这个问题并阅读文档后,我得出结论:JK 不适用于 TLS。安全标志仅适用于 http 侦听器。
我尝试过的一个可行的方案是在 HTTPD 和 Glassfish 实例之间打开一个隧道。这很容易,但可能有一些缺点。最重要的是 SSH 连接可能会中断。在这种情况下,也可以构建一个重新启动隧道的服务,但这超出了我的知识范围(和时间安排)。
由于实例所在的网络已经受到很好的保护,所以我最终通过非安全连接与 JK 进行通信。