3

好的,自从过去三天以来,我一直在徒劳地摇头,所以是时候与大师们一起讨论了!

背景
我试图让一个明显简单的设置工作——我有一个 CentOS 盒子,我想在它上面设置两个 JBoss 节点(即单个、非多宿主服务器上的两个节点),并尝试一个故障转移场景。我读到 Apache 的 mod_jk 模块会帮助我实现它。

我努力尝试遵循JBoss 5.1 Clustering Guide,但不知何故,我似乎在某个地方摸索了。

问题
我永远无法node2通过 Apache 连接,并且总是收到503 Service Unavailable消息。

配置
以下是详细信息。

中央操作系统 6
阿帕奇 2.2.15
mod_jk 1.2.35
JBoss 5.1.0 正式版

httpd.conf最后有以下行:

#包含mod_jk的具体配置文件
包括 conf/mod_jk.conf

mod_jk.conf包含以下行(除其他外):

JkMountFile conf/uriworkermap.properties

uriworkermap.properites看起来像这样:

# 简单的worker配置文件
# 将 Servlet 上下文挂载到 ajp13 worker
/jmx-console=负载均衡器
/jmx-console/*=负载均衡器
/web-console=负载均衡器
/web-console/*=负载均衡器
/jspHello=负载均衡器
/jspHello/*=负载均衡器

workers.properties

# 定义将使用的工人列表
# 用于映射请求
worker.list=负载均衡器,状态

# 定义节点1
# 修改主机为你的主机IP或DNS名称。
worker.node1.port=8009
worker.node1.host=127.0.0.1
worker.node1.type=ajp13
worker.node1.lbfactor=1

# 定义节点2
# 修改主机为你的主机IP或DNS名称。
worker.node2.port=8109
worker.node2.host=127.0.0.1
worker.node2.type=ajp13
worker.node2.lbfactor=1


# 负载均衡行为
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1

# 用于管理负载均衡器的状态工作者
worker.status.type=状态

我使用以下命令来调用node1and node2

./run.sh -c node1 -g DocsPartition -Djboss.messaging.ServerPeerID=1 -Djboss.service.binding.set=ports-default -b 0.0.0.0

./run.sh -c node2 -g DocsPartition -Djboss.messaging.ServerPeerID=2 -Djboss.service.binding.set=ports-01 -b 0.0.0.0

另外,我修改server.xml了每个目录中的文件,并在标签中node添加了相应的jvmRoute参数。Engine

观察
以下是mod_jk日志:
最初当我打开 node1、node2 和 httpd

...
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] do_shm_open::jk_shm.c (561): 将共享内存截断为 1856
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] do_shm_open::jk_shm.c (606): Initialized shared memory /var/run/httpd/mod_jk.shm.14695 size=1856 free=1728地址=0x7fe7cb7c3000
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] do_shm_open_lock::jk_shm.c (476): 打开共享内存锁 /var/run/httpd/mod_jk.shm.14695.lock
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'ServerRoot' -> '/etc/httpd'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.list' -> 'loadbalancer,status'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.node1.port' -> '8009'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.node1.host' -> '127.0.0.1'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.node1.type' -> 'ajp13'
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] jk_map_dump::jk_map.c (589):地图转储:'worker.node1.lbfactor' -> '1'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.node2.port' -> '8109'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.node2.host' -> '127.0.0.1'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.node2.type' -> 'ajp13'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.node2.lbfactor' -> '1'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589):地图转储:'worker.loadbalancer.type' -> 'lb'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.loadbalancer.balance_workers' -> 'node1,node2'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.loadbalancer.sticky_session' -> '0'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_map_dump::jk_map.c (589): 地图转储:'worker.status.type' -> 'status'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] build_worker_map::jk_worker.c (241): 创建工作负载均衡器
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] wc_create_worker::jk_worker.c (145): 即将创建 lb 的实例负载均衡器
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] wc_create_worker::jk_worker.c (158): 即将验证和初始化负载均衡器
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] wc_create_worker::jk_worker.c (145): 即将创建 ajp13 的实例 node1
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] wc_create_worker::jk_worker.c (158): 即将验证和初始化 node1
[2012 年 9 月 6 日星期四 02:21:54] [14695:140633527957472] [调试] ajp_validate::jk_ajp_common.c (2679):工作节点 1 联系人是 '127.0.0.1:8009'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] ajp_init::jk_ajp_common.c (2877):设置端点选项:
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2880): keepalive: 0
[2012 年 9 月 6 日星期四 02:21:54] [14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2884):套接字超时:0
[2012 年 9 月 6 日星期四 02:21:54] [14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2888):套接字连接超时:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2892):缓冲区大小:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2896):池超时:0
[2012 年 9 月 6 日星期四 02:21:54] [14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2900):ping 超时:10000
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2904):连接超时:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2908):回复超时:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2912): prepost timeout: 0
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] ajp_init::jk_ajp_common.c (2916):恢复选项:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2920):重试次数:2
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2924):最大数据包大小:8192
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] ajp_init::jk_ajp_common.c (2928):重试间隔:100
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] ajp_create_endpoint_cache::jk_ajp_common.c (2737):将连接池大小设置为 1,最小值为 1 并获取超时 200
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] wc_create_worker::jk_worker.c (145): 即将创建 ajp13 的实例 node2
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] wc_create_worker::jk_worker.c (158): 即将验证和初始化 node2
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_validate::jk_ajp_common.c (2679):工作节点 2 联系人是 '127.0.0.1:8109'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] ajp_init::jk_ajp_common.c (2877):设置端点选项:
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2880): keepalive: 0
[2012 年 9 月 6 日星期四 02:21:54] [14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2884):套接字超时:0
[2012 年 9 月 6 日星期四 02:21:54] [14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2888):套接字连接超时:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2892):缓冲区大小:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2896):池超时:0
[2012 年 9 月 6 日星期四 02:21:54] [14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2900):ping 超时:10000
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2904):连接超时:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2908):回复超时:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2912): prepost timeout: 0
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] ajp_init::jk_ajp_common.c (2916):恢复选项:0
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2920):重试次数:2
[2012 年 9 月 6 日星期四 02:21:54][14695:140633527957472] [调试] ajp_init::jk_ajp_common.c (2924):最大数据包大小:8192
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] ajp_init::jk_ajp_common.c (2928):重试间隔:100
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] ajp_create_endpoint_cache::jk_ajp_common.c (2737):将连接池大小设置为 1,最小值为 1 并获取超时 200
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] validate::jk_lb_worker.c (1702): Balanced worker 0 在域中具有名称 node1 和路由 node1
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] validate::jk_lb_worker.c (1702): Balanced worker 1 在域中具有名称 node2 和路由 node2
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] update_mult::jk_lb_worker.c (262): worker node1 获得多重性 1
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] update_mult::jk_lb_worker.c (262): worker node2 获得多重性 1
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] jk_lb_push::jk_lb_worker.c (353): 从 mem (0->1) 同步 lb 'loadbalancer' 的 shm
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] build_worker_map::jk_worker.c (241): 创建工作状态
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] wc_create_worker::jk_worker.c (145): about to create instance status of status
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] wc_create_worker::jk_worker.c (158):即将验证和初始化状态
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] init::jk_status.c (5078): 状态工作者'status'是读/写并且有css'(null)',前缀'worker ', 命名空间 'jk:', xml 命名空间 'xmlns:jk="http://tomcat.apache.org"', 文档类型 '(null)'
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [debug] init::jk_status.c (5129): Status worker 'status' 对 '0000000f' 的评价很好,对 '00ff1010' 评价很差
[Thu Sep 06 02:21:54 2012][14695:140633527957472] [info] init_jk::mod_jk.c (3365): mod_jk/1.2.35 已初始化
...

当我尝试访问应用程序时

...
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] find_match::jk_uri_worker_map.c (949): 找到通配符匹配 '/jspHello/*=loadbalancer'
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] jk_handler::mod_jk.c (2621): 进入处理程序 jakarta-servlet worker=loadbalancer r->proxyreq=0
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] wc_get_worker_for_name::jk_worker.c (115): 找到一个工作负载均衡器
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] wc_maintain::jk_worker.c (338):维护工作负载均衡器
[2012 年 9 月 6 日星期四 02:24:42][14700:140633527957472] [调试] wc_get_name_for_type::jk_worker.c (292): 找到工人类型 'lb'
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] init_ws_service::mod_jk.c (1097): 服务协议=HTTP/1.1 方法=GET ssl=false 主机=(null) addr=:: 1 name=localhost 端口=80 auth=(null) user=(null) laddr=::1 raddr=::1 uri=/jspHello/
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] service::jk_lb_worker.c (1192): service sticky_session=0 id='empty'
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] get_most_suitable_worker::jk_lb_worker.c (1061): found best worker node2 (node2) using method 'Request'
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] service::jk_lb_worker.c (1237): service worker=node2 route=node2
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_get_endpoint::jk_ajp_common.c (3146):在 0 次重试后获取的连接池 slot=0
[2012 年 9 月 6 日星期四 02:24:42][14700:140633527957472] [调试] ajp_marshal_into_msgb::jk_ajp_common.c (626): ajp 编组完成
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_service::jk_ajp_common.c (2441):处理 node2 重试 2 次
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_send_request::jk_ajp_common.c (1615): (node2) 所有端点都已断开连接。
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] jk_open_socket::jk_connect.c (485): 套接字 TCP_NODELAY 设置为 On
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] jk_open_socket::jk_connect.c (609): 试图将套接字 14 连接到 127.0.0.1:8109
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [info] jk_open_socket::jk_connect.c (627): 连接到 127.0.0.1:8109 失败 (errno=13)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [info] ajp_connect_to_endpoint::jk_ajp_common.c (992): 无法打开套接字到 (127.0.0.1:8109) (errno=13)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [error] ajp_send_request::jk_ajp_common.c (1621): (node2) 连接到后端失败。Tomcat 可能未启动或正在侦听错误的端口 (errno=13)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [info] ajp_service::jk_ajp_common.c (2614): (node2) 向 tomcat 发送请求失败(可恢复),因为请求发送期间出错(尝试 = 1)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_service::jk_ajp_common.c (2463):重试 1,在重试前休眠 100 毫秒
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_send_request::jk_ajp_common.c (1615): (node2) 所有端点都已断开连接。
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] jk_open_socket::jk_connect.c (485): 套接字 TCP_NODELAY 设置为 On
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] jk_open_socket::jk_connect.c (609): 试图将套接字 14 连接到 127.0.0.1:8109
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [info] jk_open_socket::jk_connect.c (627): 连接到 127.0.0.1:8109 失败 (errno=13)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [info] ajp_connect_to_endpoint::jk_ajp_common.c (992): 无法打开套接字到 (127.0.0.1:8109) (errno=13)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [error] ajp_send_request::jk_ajp_common.c (1621): (node2) 连接到后端失败。Tomcat 可能未启动或正在侦听错误的端口 (errno=13)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [info] ajp_service::jk_ajp_common.c (2614): (node2) 向 tomcat 发送请求失败(可恢复),因为请求发送期间出错(尝试 = 2)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [error] ajp_service::jk_ajp_common.c (2634): (node2) 连接到 tomcat 失败。
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_reset_endpoint::jk_ajp_common.c (786): (node2) 使用套接字 -1 重置端点(套接字关闭)
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_done::jk_ajp_common.c (3077):回收工作节点 2 和套接字 -1 的连接池
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] service::jk_lb_worker.c (1455): worker node2 将本地错误升级为全局错误
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [info] service::jk_lb_worker.c (1469): service failed, worker node2 处于错误状态
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] service::jk_lb_worker.c (1480): 可恢复错误...将尝试在其他工作人员上恢复
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] get_most_suitable_worker::jk_lb_worker.c (1061): found best worker node1 (node1) using method 'Request'
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] service::jk_lb_worker.c (1237): service worker=node1 route=node2
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_get_endpoint::jk_ajp_common.c (3146):在 0 次重试后获取的连接池 slot=0
[2012 年 9 月 6 日星期四 02:24:42][14700:140633527957472] [调试] ajp_marshal_into_msgb::jk_ajp_common.c (626): ajp 编组完成
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_service::jk_ajp_common.c (2441):处理 node1 重试 2 次
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_send_request::jk_ajp_common.c (1615): (node1) 所有端点都断开连接。
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] jk_open_socket::jk_connect.c (485): 套接字 TCP_NODELAY 设置为 On
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] jk_open_socket::jk_connect.c (609): 试图将套接字 14 连接到 127.0.0.1:8009
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] jk_open_socket::jk_connect.c (635): socket 14 [127.0.0.1:38909 -> 127.0.0.1:8009] 已连接
[Thu Sep 06 02:24:42 2012][14700:140633527957472] [debug] ajp_connection_tcp_send_message::jk_ajp_common.c (1175): 发送到 ajp13 pos=4 len=570 max=8192
[2012 年 9 月 6 日星期四 02:24:42] [14700:140633527957472] [调试] ajp_connection_tcp_send_message::jk_ajp_common.c (1175): 0000 12 34 02 36 02 02 00 08 48 48 54 54 3 50 2。 ...HTTP/1.1
...

如您所见,它在通过 node1 处理请求之前尝试连接到 node2 两次。直到时间到为止node1。一旦我把它拿下来,当我尝试访问时,我就开始收到 503 错误。

我不确定这是一个mod_jk问题还是我错过了什么。

有什么建议么?

更新:它与两个单独的(物理)节点一起工作,但我仍然无法让它在具有单独端口(8009 和 8109)的同一个盒子上工作。

4

3 回答 3

1

听起来 JBoss 没有使用您认为的端口。一个好的诊断工具是 lsof(可以通过 yum 安装);

lsof -i -n -P

并查看 JBoss 进程正在侦听的端口。从那里更正您的配置。

于 2012-09-05T21:10:19.533 回答
0

JBoss 可能正在侦听端口 8009 和 8109,但默认情况下,它只侦听 127.0.0.1接口,这意味着这些端口不会对远程连接开放。

要让 jboss 监听所有接口,请使用这个运行选项(来自run.sh --help):

-b, --host= 绑定所有 JBoss 服务的地址

并将值设置为0.0.0.0

于 2012-09-07T17:08:10.643 回答
0

解决此问题的方法是将 AJP 端口更改为不同的范围。我的 CentOS /Red Hat 中的 SELinux 阻止了端口 8109。所以我将 AJP 端口更改为 81,问题得到了解决。

于 2016-07-04T14:49:20.900 回答