JBOSS SESSION集群配置过程
vi /usr/local/jboss/server/all/deploy/tc5-cluster.sar/META-INF/jboss-service.xml
找到<config><udp,将><config>到</config>全部注释掉.
jboss session复制有UDP和TCP两种方式.UDP采用多播方式,但问题比较多,所以采用TCP方式。

找到<config> <tcp,将><config>到</config>生效.并对该部分进行以下修改:

将全部down_thread和up_thread的false都改为true.
在<tcp bind_addr=”后填入本机的IP,比如<TCP bind_addr=”>
在<tcpping initial_hosts=”后填入本机和集群其他全部Jboss节点的IP[7810],比如<tcpping initial_hosts=”192.168.130.95[7810],192.168.130.99[7810],192.168.130.112[7810]”></tcpping>
配置应用程序
在应用程序的web.xml的<web-app>段中增加<distributable />
测试程序
Jboss4集群配置 (参考资料1)
1.前言
2006年,Jboss公司被Redhat公司收购了。这直接导致Jboss产品结构调整,并将以前收费的Jboss AS文档改为免费。jijian91本次集群试验的最初依据就是由此得到的Jboss 4.0.5集群配置文档。

但这份官方文档并不可靠,在一些关键配置上含混不清,而且夹杂了很多适用于过去版本、现已作废的Jboss集群配置内容。这导致本次jboss集群配置试验很大程度上是依靠猜测和反复尝试完成的。究其原因,是因为Jboss的集群特性尚处于发展之中,Jboss开发者还在不停地修改、完善、增加特性,版本间的变化很大,文档的更新速度和质量难以保证。所以,jijian91提醒各位对官方文档要认准版本,只可参考,切忌尽信.切切.

2.集群知识
集群概念
集群(Cluster)是一组计算机节点的集合,它们作为一个整体向用户提供一组网络资源。一个理想的集群对用户是透明的。用户由单一入口访问集群的资源,从来不会意识到集群中的节点。在他们看来,集群是一个系统,而非多个计算机系统。集群还应该支持随意增加和减少集群系统的节点,而这同样不会影响到用户的访问。

集群分类
习惯上,把集群分为高可用(High Availability,简称HA)集群和高性能计算(High Perfermance Computing,简称HPC)集群两类。

HA集群的目标是提高系统的可使用性(availability),即可靠性(reliability)和可维护性(maintainability)。请不要将集群中的可使用性(availability)与UE和交互设计中的可用性(Usability)混淆。

HA集群的核心是防止单点失效,这一般是通过失败转移来实现的,即在一个节点失效后由另一个节点接替服务。不丢失用户状态。HA集群的其他主要特性还包括负载均衡、session同步等。我们使用的SQL Server数据库的双机热备和Oracle的RAC都属于HA集群。

HPC集群采用并行计算技术提供超大规模计算和存储能力,多数超级计算机都是HPC集群。这不是我们关注的集群。

Jboss集群架构
Jboss集群是HA集群。

Jboss集群有2种架构。一是客户端拦截器(Client-side interceptor)架构,一是负载均衡器(Load balancer)架构。

客户端拦截器架构适于用C/S结构,负载均衡器架构适用于B/S结构。本文只叙述负载均衡器架构的Jboss集群。


负载均衡器架构由负载均衡器和n个集群节点组成。每个节点是一个Jboss服务器实例。负载均衡器是全局唯一的前置机,全部用户请求都发到负载均衡器,由其转发到各节点。当负载均衡器发现一个节点失效后,会将请求转发到另一个节点上,从而保证服务得以延续。负载均衡器同时负责加权静态负载均衡调度。总之,负载均衡器的健康程度决定了集群的全局健康度,负载均衡器失败将导致集群全部失效。这是前置机架构集群的主要潜在问题。

Jboss的负载均衡器架构集群实际是由Tomcat的HTTP集群实现的。Jboss有自己的负载均衡器,但效果不佳,官方文档没有介绍,几乎没有人使用。一般情况下,都是与jijian91一样采用apache+mod_jk作为负载均衡器。下文叙述的都是基于这种架构。

mod_jk是apache的一个插件,负责apache与tomcat之间的通讯,是jboss集群(tomcat集群)的关键。

Jboss版本的选择
目前,Jboss主要有3、4、5三个版本系列。

Jboss 5目前只有2个beta版,实用尚需时日。

Jboss 3的最后版本是2006年3月更新的3.2.8.SP1。随着Jboss 4日益成熟和Jboss 5的开发,已经停止更新1年多的Jboss 3逐渐淡出历史舞台。

Jboss 4最新版本依次是4.2.1.GA、4.2.0.GA和4.0.5.GA。但官方网站提供的Jboss集群文档只更新到4.0.5 GA,所以选择Jboss 4.0.5 GA实现Jboss集群。

Jboss各版本的安装和配置并不相同.不但Jboss 3和Jboss 4的配置文件完全不同,各小版本间也有细微的差别.在集群中,Jboss、apache、mod_jk之间也存在着特定版本才能配合的情况。所以,为避免困扰,请严格按照以下版本安装软件:

JDK 1.5.0.12

Jboss 4.0.5 GA

apache 2.2.4

apache mod_jk 1.2.23

注意,mod_jk有1.x和2.x两个版本系列。mod_jk 2.x已经停止开发,不能使用。很多人凭直觉认为mod_jk 2.x肯定比mod_jk 1.x好,结果走了弯路。

 

3.Jboss集群配置实例概述
下文中,jijian91将以实例来叙述Jboss集群配置。

该实例包含3个Jboss节点。各节点被动接收负载均衡器转发的请求。各节点间没有横向的联系。


4.Jboss集群负载均衡器配置
步骤
先安装apache,然后配置mod_jk模块。

安装apache
下载apache代码包,上传到服务器。

解开代码包
tar xfvz httpd-2.2.4.tar.gz

编译
./configure –prefix=/usr/local/apache2 –enable-module=so –enable-module=setenvif –enable-module=rewrite –enable-rewrite=shared –enable-proxy=shared –with-mpm=prefork –enable-so –enable-auth-anon –enable-file-cache=shared –enable-cache=shared –enable-disk-cache=shared –enable-mem-cache=shared

make clean
make
make install

修改配置。本例中,jijian91使用的监听端口是8080,请根据实际情况修改。
vi /usr/local/apache2/conf/httpd.conf
将Listen 80改成Listen 8080
将User daemon和Group daemon改为User apache和Group apache
删除ServerName前的#,将该行改为ServerName 127.0.0.1:8888

添加用户和用户组
groupadd apache
useradd apache –g apache

apache mod_jk配置
下载mod_jk,将其改名为mod_jk.so,拷贝到/usr/local/apache2/modules下。

顺便说一句,找mod_jk模块费了jijian91很大精力,最后才在http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/目录下找到。我用的是mod_jk 1.2.23,看到本文的时候,mod_jk应该有新版了。但mod_jk的向下兼容做得不太好,最好先用mod_jk 1.2.23调试,成功后再尝试换用新版mod_jk。

chmod +x /usr/local/apache2/modules/mod_jk.so

在/usr/local/apache2/conf/httpd.conf的末尾增加:
Include conf/mod_jk.conf

建立空文件/usr/local/apache2/conf/uriworkermap.properties

vi /usr/local/apache2/conf/mod_jk.conf,输入以下内容:
# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat “[%a %b %d %H:%M:%S %Y]”
# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat
JkRequestLogFormat “%w %V %T”
# Mount your applications
JkMount /application/* loadbalancer
# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties
# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm
# Add jkstatus for managing runtime data

JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1

 

vi /usr/local/apache2/conf/workers.properties,增加以下内容:
# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status
# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=192.168.130.95
worker.node1.type=ajp13
worker.node1.lbfactor=1
# Define Node2
# modify the host as your host IP or DNS name.
worker.node2.port=8009
worker.node2.host= 192.168.130.99
worker.node2.type=ajp13
worker.node2.lbfactor=0
# Define Node3
# modify the host as your host IP or DNS name.
worker.node3.port=8009
worker.node3.host= 192.168.130.112
worker.node3.type=ajp13
worker.node3.lbfactor=1
# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2,node3
worker.loadbalancer.sticky_session=1
#worker.list=loadbalancer
# Status worker for managing load balancer
worker.status.type=status

说明:
worker.node1.host、worker.node2.host和worker.node3.host要改成jboss集群各机器的实际IP.
如果有更多的节点,顺序定义更多的node段,并在worker.loadbalancer.balance_workers后全部列出.
lbfactor是负载分配权重,值越大分配的负载越多.
更多配置参数详见tomcat配置说明

配置apache自动启动
ln –s /usr/local/apache2/apachectl /etc/init.d/apache
chmod 777 /etc/init.d/apache
ln –s /etc/init.d/apache /etc/rc3.d/S80apache
ln –s /etc/init.d/apache /etc/rc3.d/K20apache
ln –s /etc/init.d/apache /etc/rc4.d/S80apache
ln –s /etc/init.d/apache /etc/rc4.d/K20apache
ln –s /etc/init.d/apache /etc/rc5.d/S80apache
ln –s /etc/init.d/apache /etc/rc5.d/K20apache

5.Jboss集群节点配置
步骤
在集群的各节点上,先安装JDK,然后安装配置Jboss。不用着急,跟着jijian91一步步来。

安装JDK
http://sun.com下载JDK安装包,上传到服务器。

chmod +x jdk-1_5_0_12-linux-i586-rpm.bin
./jdk-1_5_0_12-linux-i586-rpm.bin
根据提示安装。

设置Java路径。
vi /etc/profile,在结尾增加:
JAVA_HOME=/usr/java/jdk1.5.0_12
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=.:$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH

用JDK代替Redhat Linux AS4预装的gcj:

cd /usr/bin
ln -s -f /usr/java/jdk1.5.0_12/bin/java
ln -s -f /usr/java/jdk1.5.0_12/bin/javac

执行java –version,显示以下信息表示jdk正确安装:
java version “1.5.0_12″
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_12-b04)
Java HotSpot(TM) Client VM (build 1.5.0_12-b04, mixed mode, sharing)

安装Jboss
下载jboss-4.0.5.GA和jems-installer,并上传到服务器。

完整安装Jboss 4.0.3 sp1到4.0.5.GA各版本,必须使用jems-installer和JDK 1.5。

Jboss可以采用图形方式和命令行方式安装。图形方式安装方便,但要求服务器安装X windows,且在服务器上操作或使用支持x windows的远程终端(jijian91推荐用xmanager).

图形方式
在x windows的终端窗口下,执行java –jar jems-installer-1.2.0.GA.jar,出现Jboss安装图形界面。

选择“中文”。
下一步。
同意协议。
安装路径设置为/usr/local/jboss,下一步。
选择”all”,下一步。
选择”advance”,把Name由default改为all.其余直接按下一步。
输入Admin密码,下一步。
等待安装结束,完成。

命令行方式
java -jar jems-installer-1.2.0.GA.jar -installGroup all installpath=/usr/local/jboss
mv /usr/local/jboss/server/default /usr/local/jboss/server/all

配置Jboss
修改配置。本例中,提供服务的监听端口是8888,请根据实际情况修改。
vi /usr/local/jboss/server/all/deploy/jbossweb-tomcat55.sar/server.xml
找到 找到.
注意,jvmRoute是节点号,要与在apache的workers.properties中的定义相对应.

vi /usr/local/jboss/server/all/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml
找到UseJK,改为true.

配置jboss自动启动
cp /usr/local/jboss/jboss_init_redhat.sh /etc/init.d/jboss
chmod 777 /etc/init.d/jboss
ln –s /etc/init.d/jboss /etc/rc3.d/S80jboss
ln –s /etc/init.d/jboss /etc/rc3.d/K20jboss
ln –s /etc/init.d/jboss /etc/rc4.d/S80jboss
ln –s /etc/init.d/jboss /etc/rc4.d/K20jboss
ln –s /etc/init.d/jboss /etc/rc5.d/S80jboss
ln –s /etc/init.d/jboss /etc/rc5.d/K20jboss

vi /etc/init.d/jboss
将JBOSS_HOME一行改为JBOSS_HOME=${JBOSS_HOME:-”/usr/local/jboss”}
将JBOSS_USER一行改为JBOSS_USER=${JBOSS_USER:-”root”}
将JAVAPTH一行改为JAVAPTH=${JAVAPTH:-”/usr/java/jdk1.5.0_12″}
将JBOSS_CONF一行改为JBOSS_CONF=${JBOSS_CONF:-”all”}
将JBOSSSH一行改为JBOSSSH=${JBOSSSH:-”$JBOSS_HOME/bin/run.sh -c $JBOSS_CONF”}
将eval $JBOSS_CMD_START >${JBOSS_CONSOLE} 2>&1 &改为eval $JBOSS_CMD_START >${JBOSS_CONSOLE} &
将$SUBIT “$JBOSS_CMD_START >${JBOSS_CONSOLE} 2>&1 &”改为$SUBIT “$JBOSS_CMD_START >${JBOSS_CONSOLE} &”

6.启动Jboss集群
步骤
先启动负载均衡器apache,然后启动各jboss节点。各jboss节点的启动顺序没有要求。

启动负载均衡器apache

在/usr/local/apache2/bin目录下执行./httpd –k start

在/usr/local/apache2/logs/mod_jk.log中,看到apache初始化mod_jk的日志:
[Wed Aug 01 10:36:11 2007][6636:63168] [info] init_jk::mod_jk.c (2743): mod_jk/1.2.23 initialized
[Wed Aug 01 10:36:11 2007][6637:63168] [info] init_jk::mod_jk.c (2743): mod_jk/1.2.23 initialized
后面如有错误信息,是因为集群中的节点尚未启动,暂时忽略。

用netstat检查8080监听端口存在,apache启动成功.

启动Jboss节点
在集群各机器的/usr/local/jboss/bin,分别执行/run.sh –c all 1>1 2>2 &

用netstat检查8888端口监听存在.
用浏览器访问各节点的8888端口,能够看到jboss的状态.
Jboss启动成功.

集群的生命期
apache能够自动发现新启动的Jboss节点。当第一个Jboss节点启动后,自动创建Jboss集群。然后依次将其他节点加入到集群中。现在访问http://192.168.8.246:8888,能够看到jboss的状态.说明请求已经被转发到Jboss节点。集群启动成功。

apache能够监视集群中各节点的状况,自动从集群中去掉无法访问的节点,从而保证每个请求都被响应。当集群的全部节点都停止工作,集群消亡。

集群的缺陷和粘着session
截止到现在,Jboss集群工作得很完美,除了session。

目前配置的Jboss集群中,各节点是被动的、相互独立的,相当于增加了节点状态检测的DNS轮询,所以session也是相互独立的。当同一用户的2个请求被转发到不同的Jboss节点上时,会出现session信息假”丢失”的现象。

为此,Jboss提出粘着session(sticky session)概念。使用粘着session后,来自同一IP的请求将被发送到同一个Jboss节点,从而保证session使用的连续性。如果应用中没有使用session,则可以使用非粘着session的jboss集群。这样,负载分布更为合理。(jijian91的话:也更简单。)

设置方法是编辑负载均衡器的/usr/local/apache2/conf/workers.properties的worker.loadbalancer.sticky_session。设置为1使用粘着session,设置为0不使用粘着session。

使用粘着session还存在一种隐患,当某个节点发生故障时,该节点的session将全部丢失。要彻底解决这个问题,就要用到jboss session复制。

7.Jboss集群的session复制

原理

jboss session复制是jboss session同步的一种实现。原理是在各Jboss节点间建立横向联系,每个节点都将本节点的session变化同步到其他所有节点上。

jboss的session复制与HTTP集群是相互配合、相互独立的两个系统。session复制是节点间的横向联系,HTTP集群是负载均衡器与节点的纵向联系。

配置Jboss节点


vi /usr/local/jboss/server/all/deploy/tc5-cluster.sar/META-INF/jboss-service.xml

找到<config><udp,将><config>到</config>全部注释掉.
jboss session复制有UDP和TCP两种方式.UDP采用多播方式,但问题比较多,所以jijian91采用TCP方式。

找到<config> <tcp,将><config>到</config>生效.并对该部分进行以下修改:

将全部down_thread和up_thread的false都改为true.
在<tcp bind_addr=”后填入本机的IP,比如<TCP bind_addr=”>
在<tcpping initial_hosts=”后填入本机和集群其他全部Jboss节点的IP[7810],比如<tcpping initial_hosts=”192.168.130.95[7810],192.168.130.99[7810],192.168.130.112[7810]”></tcpping>
其他参数还包括:
ClusterName是集群名称,比如partition1.
在同一局域网内,可以存在多个jboss集群,根据集群名称区分它们.所以,集群中各节点配置的集群名称必须一致,而机器IP则没有特殊要求,只要它们能相互连通. 理论上,可以在一台机器上安装多个Jboss实例,分属于不同的集群.但这会极大地增加复杂度,是不好的配置方式.jijian91严重不建议给自己找麻烦。

IsolationLevel是隔离等级.
可选值包括:SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED, 和 NONE。这里的隔离级别和数据库的隔离级别有同样的含义,对于大多数WEB应用程序来讲通常设置为REPEATABLE_READ。

CacheMode是缓存模式。
由于session复制是通过缓存实现的,所以实际上是复制模式.可选值包括:REPL_SYNC 和REPL_ASYNC,确定改变是应该同步还是异步复制。缺省值是REPL_ASYNC.使用同步复制,确保在请求完成之前传播改变,session同步没有滞后,但效率低。

配置应用程序

在应用程序的web.xml的<web-app>段中增加<distributable />。

在jboss-web.xml中增加以下内容:

<jboss-web>
<replication-config>
<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
<replication-granularity>SESSION</replication-granularity>
<replication-field-batch-mode>

jboss4集群配置至此结束。

 

Jboss4集群配置 (参考资料2)
在default目录下快速配置JBoss集群(Web方面)

说起JBoss集群好像很高深的样子,其实一点也不恐怖,建立一个集群很简单,难的是怎么针对具体的应用优化服务器和实现负载均衡(学习中^o^)。本文将带领大家在JBoss的default目录下建立一个简单的Web方面的JBoss集群。

      搭建环境

   两台电脑 //其实一台也够了,不过需要修改其中一个JBoss监听的端口,要不然有冲突
   jboss-4.0.4.GA
   apache_2.0.59 //我使用的是apache_2.0.59-win32-x86-no_ssl,其实无所谓的
   mod_jk-apache-2.0.59.so //Apache请求分发的模块,官网上可以找到

   首先安装JBoss,我用的是zip格式的,直接解压缩就可以了,在两台电脑里分别安装。

   接下来在其中一台电脑上(这里是192.168.0.2)安装Apache(其实应该再找一台电脑来安装的),很简单,略过^o^(偶是不是很懒^o^)

      配置JBoss

   假设两台电脑的IP分别为192.168.0.2和192.168.0.3。我们这里使用JBoss的default目录。

   将如下文件从%JBoss_Home%/server/all/lib里面拷到%JBoss_Home%/server/default/lib目录下:

   jbossha.jar(加载org.jboss.ha.framework.server.ClusterPartition)
   jgroups.jar(JBoss集群底层通信协议)
   jboss-cache.jar(加载org.jboss.cache.aop.TreeCacheAop)

   还要从%JBoss_Home%/server/all/deploy里把cluster-service.xml和tc5-cluster.sar拷贝到%JBoss_Home%/server/default/deploy里面。

   编辑192.168.0.2的%JBoss_Home%/server/default/deploy/jbossweb-tomcat55.sar/server.xml
   修改下面代码:

<Engine name="jboss.web" defaultHost="localhost">

 

   修改为:

<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">

 

   其中 jvmRoute是用来让apache识别的节点名称,一个节点一个名称,注意不要有重复的(可以结合IP设置)。

   同理编辑192.168.0.3的%JBoss_Home%/server/default/deploy/jbossweb-tomcat55.sar/server.xml
注意把jvmRoute设置为node2,可以设置成别的只要和192.168.0.2的不重复就行,但是要和Apache的workers.properties(稍后介绍)下的配置一致。

   在%JBoss_Home%/server/default/deploy/jbossweb-tomcat55.sar/ROOT.war/目录下添加一个新文件夹/test,并在里面添加如下3个jsp文件:

index.jsp

 1<%@ page contentType="text/html;charset=ISO8859_1" %>
 2
 3<html>
 4<head>
 5<title>Test</title>
 6<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 7</head>
 8
 9<body onload="document.form.name.focus()">
10<br><br><br>
11<center>
12The host is : <%=java.net.InetAddress.getLocalHost().toString()%><br>
13Your session id is : <%=session.getId()%><br>
14Your session detail is : <%=session.toString()%><br>
15Your session context is : <%=session.getSessionContext()%><br><br>
16Please input your name:<br>
17<form action="test_action.jsp" method="POST" name="form">
18    <input type="input" name="name"/>
19    <input type="submit" value="提交">
20</form>
21</center>
22</body>
23</html>
24
25


test_action.jsp

 1<%@ page contentType="text/html;charset=ISO8859_1" %>
 2
 3<html>
 4<head>
 5<title>Test Action</title>
 6<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 7</head>
 8<%
 9    String name = request.getParameter("name");
10    session.setAttribute("name",name);
11    String host = java.net.InetAddress.getLocalHost().toString();
12%>
13<body>
14<br>
15<br>
16<center>
17The host is : <%=host%><br><br>
18Your session id is : <%=session.getId()%><br>
19Your session detail is : <%=session.toString()%><br>
20Your session context is : <%=session.getSessionContext()%><br><br>
21Your name is : <%=name%><br>
22This name is set into the session.<br>
23Please click <a href="session.jsp">here</a> to check the session valid or not.
24</center>
25</body>
26</html>
27
28


session.jsp

 1<%@ page contentType="text/html;charset=ISO8859_1" %>
 2
 3<html>
 4<head>
 5<title>Test Action</title>
 6<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 7</head>
 8<%
 9    String name = null;
10    if(session.getAttribute("name")!=null)
11        name = (String)session.getAttribute("name");
12    String host = java.net.InetAddress.getLocalHost().toString();
13%>
14<body>
15<br>
16<br>
17<center>
18The host is : <%=host%><br>
19Your session id is : <%=session.getId()%><br>
20Your session detail is : <%=session.toString()%><br>
21Your session context is : <%=session.getSessionContext()%><br><br>
22<%
23    if(name!=null){
24        out.print("Your name is "+name+"<br>");
25        out.print("The session is valid.");
26    }
27    else{
28        out.print("The session is invalid!!!");
29    }
30%>
31<a href="index.jsp">Return!</a>
32</center>
33</body>
34<%
35    if(session.getAttribute("name")!=null)
36        session.invalidate();
37%>
38</html>
39
40


   编辑%JBoss_Home%/server/default/deploy/jbossweb-tomcat55.sar/ROOT.war/WEB-INF/web.xml在<web-app>节点下增加如下代码:

1 <distributable/>

   完成后web.xml代码如下:

 1<?xml version="1.0" encoding="ISO-8859-1"?>
 2
 3<!DOCTYPE web-app
 4    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 5    "http://java.sun.com/dtd/web-app_2_3.dtd">
 6
 7<web-app>
 8  <distributable/>
 9  <display-name>Welcome to JBoss</display-name>
10  <description>
11     Welcome to JBoss
12  </description>
13  <servlet>
14    <servlet-name>Status Servlet</servlet-name>
15    <servlet-class>org.jboss.web.tomcat.tc5.StatusServlet</servlet-class>
16  </servlet>
17  <servlet-mapping>
18    <servlet-name>Status Servlet</servlet-name>
19    <url-pattern>/status</url-pattern>
20  </servlet-mapping>
21</web-app>
22

   看到第8行了吗?^o^

   到这里JBoss就配置完成了^o^

      配置Apache

   JBoss的Web集群使用apache的mod_jk,浏览器请求apache服务器,apache服务器根据workers.properties中的配置进行request分发,apache服务器和Jboss中的Tomcat可以用ajp1.3进行通信的,request通过ajp1.3协议的包装被发送到Jboss,Jboss执行后返回结果。

   将下载到的mod_jk-apache-2.0.59.so保存到%Apache%/modules/目录下,并去掉版本号重命名为“mod_jk.so”,如果不改也可以在mod-jk.conf文件(稍后介绍)里修改配置。

   在%Apache%/conf/目录下新建mod-jk.conf,并将如下代码添加进去:

 1# Load mod_jk module
 2# Specify the filename of the mod_jk lib
 3LoadModule jk_module modules/mod_jk.so
 4# Where to find workers.properties
 5JkWorkersFile conf/workers.properties
 6# Where to put jk logs
 7JkLogFile logs/mod_jk.log
 8# Set the jk log level [debug/error/info]
 9JkLogLevel debug
10# Select the log format
11JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
12# JkOptions indicates to send SSK KEY SIZE
13JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
14# JkRequestLogFormat
15JkRequestLogFormat "%w %V %T"
16# Mount your applications
17#JkMount /application/* loadbalancer
18JkMount /* loadbalancer
19# You can use external file for mount points.
20# It will be checked for updates each 60 seconds.
21# The format of the file is: /url=worker
22# /examples/*=loadbalancer
23JkMountFile conf/uriworkermap.properties
24# Add shared memory.
25# This directive is present with 1.2.10 and
26# later versions of mod_jk, and is needed for
27# for load balancing to work properly
28JkShmFile logs/jk.shm
29# Add jkstatus for managing runtime data
30<Location /jkstatus/>
31JkMount status
32Order deny,allow
33Deny from all
34Allow from 127.0.0.1
35</Location>

   上述代码的第3行就是配置mod_jk.so模块的路径。

   编辑%Apache%/conf/httpd.conf在最后一行添加如下代码:

1Include conf/mod-jk.conf


   在 %Apache%/conf/目录下添加workers.properties文件,该文件就是配置Apache所要将request转发到的JBoss的路径信息,代码如下:

 1# 定义request所要转发到的节点
 2worker.list=loadbalancer,status
 3# 定义节点 Node1
 4worker.node1.port=8009
 5worker.node1.host=192.168.0.2
 6worker.node1.type=ajp13
 7worker.node1.lbfactor=1
 8worker.node1.cachesize=10
 9# 定义节点 Node2
10worker.node2.port=8009
11worker.node2.host=192.168.0.3
12worker.node2.type=ajp13
13worker.node2.lbfactor=1
14worker.node2.cachesize=10
15# 负载配置
16worker.loadbalancer.type=lb
17worker.loadbalancer.balance_workers=node1,node2
18worker.loadbalancer.sticky_session=0
19worker.status.type=status


   上述代码中:
   port是配置JBoss AJP所监听的端口号,可以在%JBoss_Home%/server/default/deploy/jbossweb-tomcat55.sar/server.xml 看到,如下

1<!-- A AJP 1.3 Connector on port 8009 -->
2<Connector port="8009" address="${jboss.bind.address}"
3         emptySessionPath="true" enableLookups="false"
4         redirectPort="8443" protocol="AJP/1.3"/>

   host定义JBoss所在机器的IP地址
   lbfactor定义该节点的权重,数字越大分发到该节点的request越多
   cachesize是servlet线程池的大小(对session复制有影响)

   到这里所有的配置就全部完成啦^o^

   启动192.168.0.2上的apache和两台机器上的JBoss。
   打开浏览器,输入网址访问apache:http://192.168.0.2/test/index.jsp,回车!看到了吧?

   页面上有JBoss所在机器的IP地址,刷新页面还能看到IP在变化,说明apache将request分发到了不同的JBoss上,在输入框中输入随便一个字符串并提交还能测试JBoss 的session复制情况。

^o^

很好的文章,uriworkermap.properties文件没有创建,需要创建.不然会报错

(转自:http://blog.csdn.net/dong_007_007/article/details/2832970)