好的,自从过去三天以来,我一直在徒劳地摇头,所以是时候与大师们一起讨论了!
背景
我试图让一个明显简单的设置工作——我有一个 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=状态
我使用以下命令来调用node1
and 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)的同一个盒子上工作。