一、目标
配置一个可扩展、高可用、有负载均衡和错误恢复的 Tomcat 集群。
二、需要的软件包
jakarta-tomcat-5.0.28.tar.gz
jakarta-tomcat-connectors-jk2-src-current.tar.gz
httpd-2.0.52.tar.gz
j2sdk-1_4_2_07-linux-i586-rpm.bin
JGroups-2.2.7.bin.zip
注:JGroups-2.2.7.bin.zip 包,可以从http://www.jgroups.org下载得到。
jakarta-tomcat-connectors-jk2-src-current.tar.gz包可以从http://jakarta.apache.org/site/sourceindex.cgi下载得到。
三、APACHE2+TOMCAT5整合安装
1、 安装APACHE2
httpd-2.0.52.tar.gz
tar zxvf httpd-2.0.52.tar.gz
cd httpd-2.0.52
在这里想要说的是如果你只要求与TOMCAT做整合的话就如下面的命令来进行编译。
./configure -prefix=/usr/local/apache2 -enable-so
make
make installl
如果你想要把所有的功能都打开用如下命令编译
./configure -prefix=/usr/local/apache2 --enable-mods-shared=all
make
make install
然后启动apache2
/usr/local/apache2/bin/apachectl start
用links 127.0.0.1 来查看APACHE是否安装正常。
2、 安装j2sdk-1_4_2_07-linux-i586-rpm.bin
./ j2sdk-1_4_2_07-linux-i586-rpm.bin
rpm –ivh j2sdk-1_4_2_07-linux-i586-rpm
修改用户根目录的环境变量
vi ~/.bash_profile
######################################
JAVA_HOME=/usr/java/j2sdk1.4.2_07
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
CATALINA_BASE=/usr/local/jakarta-tomcat-5.0.28
CATALINA_HOME=/usr/local/jakarta-tomcat-5.0.28
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
#####################################
export USERNAME BASH_ENV PATH JAVA_HOME CLASSPATH CATALINA_BASE CATALINA_HOME
退出当前SHELL,然后再次LOGIN。
进行java
#java
如出现java信息,说明环境变量配置完毕。
3、 安装TOMCAT 5.0.28
tar zxvf jakarta-tomcat-5.0.28.tar.gz
mv jakarta-tomcat-5.0.28 /usr/local
cd jakarta-tomcat-5.0.28/bin
startup.sh
然后用 links 127.0.0.1:8080 来查看能否打开。如果出现: Apache Tomcat/5.0.28 则TOMCAT 5.0.28 安装正常。
4、 整合APACHE2与TOMCAT 5.0.28
tar zxvf jakarta-tomcat-connectors-jk2-src-current.tar.gz
cd jakarta-tomcat-connectors-jk2-src-current/jk/native2
./configure --with-apxs2=/usr/local/apache2/bin/apxs
make
cd ../build/jk2/apache2
/usr/local/apache2/bin/apxs -n jk2 -i mod_jk2.so
现在可以看到mod_jk2.so文件已经在你的apache2/modules/ 中了
[root@localhost modules]# ls
httpd.exp mod_jk2.so
[root@localhost modules]#
编辑apache2/conf/httpd.conf
LoadModule jk2_module modules/mod_jk2.so 保存
在apache/conf/中新建文件workers2.properties,内容为下
[root@localhost conf]# cat workers2.properties
[shm]
file=/usr/local/apache2/logs/shm.file
size=1048576
#First Tomcat
[channel.socket:tomcat1]
port=8009
host=127.0.0.1
[ajp13:tomcat1]
channel=channel.socket:tomcat1
#Second Tomcat
[channel.socket:tomcat2]
port=8010
host=127.0.0.1
[ajp13:localhost:8010]
channel=channel.socket:tomcat2
[lb:lb1]
worker=ajp13:tomcat1
worker=ajp13:tomcat2
# Uri mapping
[uri:/*.jsp]
group=lb:lb1
[uri:/*.do]
group=lb:lb1
[root@localhost conf]#
启动apache2
cd apache2/bin
./apachectl start
测试整合效果:
links 127.0.0.1
正常应打开的是apache 的页面。
Links 127.0.0.1/index.jsp
打开的应是 TOMCAT 的页面。
四、TOMCAT5.0.28的集群配置
如果以上的工作都做完了,现在可以开始TOMCAT5.0.28的集群配置
这样Jgroups-2.2.7 就安装完毕了。
1、 配置apache2
在这之前APACHE2的conf目录下应有 workers2.properties 内容如下。
[root@localhost conf]# cat /usr/local/apache2/conf/workers2.properties
[shm]
file=/usr/local/apache2/logs/shm.file
size=1048576
#First Tomcat
[channel.socket:tomcat1]
port=8009
host=127.0.0.1
[ajp13:tomcat1]
channel=channel.socket:tomcat1
#Second Tomcat
[channel.socket:tomcat2]
port=8010
host=127.0.0.1
[ajp13:localhost:8010]
channel=channel.socket:tomcat2
#在这里要注意的是,如果你的TOMCAT在同一台机器上,那么jk2的端口应是不一样的,如上我写的是8009和8010。
[lb:lb1]
worker=ajp13:tomcat1
worker=ajp13:tomcat2
# Uri mapping
[uri:/*]
group=lb:lb1
[root@localhost conf]#
对于jk2模块的负载均衡配置可参见相关站点,值得提及的是jk2的负载均衡还支持权重分配等优秀功能。
2、 配置TOMCAT 5
[root@localhost conf]# cat server.xml
<Server port="8006" shutdown="SHUTDOWN" debug="0">
因为要配置两个TOMCAT,所以所有有关于端口的设置都要不一样。
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"
debug="0"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
debug="0"/>
<GlobalNamingResources>
<Environment name="simpleValue" type="java.lang.Integer" value="30"/>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved">
</Resource>
<ResourceParams name="UserDatabase">
<parameter>
<name>factory</name>
<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
</parameter>
<parameter>
<name>pathname</name>
<value>conf/tomcat-users.xml</value>
</parameter>
</ResourceParams>
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />
<Engine name="Catalina" defaultHost="localhost" debug="0">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="catalina_log." suffix=".txt"
timestamp="true"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
debug="0" resourceName="UserDatabase"/>
<Host name="localhost" debug="0" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
<Logger className="org.apache.catalina.logger.FileLogger"
directory="logs" prefix="localhost_log." suffix=".txt"
timestamp="true"/>
</Host>
</Engine>
</Service>
</Server>
[root@localhost conf]#
到这里TOMCAT的设置就这样了。要把TOMCAT复制一份,然后再改相应的端口
# cp -rf /usr/local/jakarta-tomcat-5.0.28 /usr/local/jakarta-tomcat-5.0.28.2
一切配置完必以后在两个TOMCAT的/下创建 test.jsp 文件,文件内容分别如下:
[root@localhost ROOT]# cat test.jsp
<html>
<body bgcolor="red">
<center>
<%= request.getSession().getId() %>
<h1>Tomcat 1</h1>
</body>
</html>
[root@localhost ROOT]#
[root@localhost ROOT]# cat /usr/local/jakarta-tomcat-5.0.28.2/webapps/ROOT/test.jsp
<html>
<body bgcolor="blue">
<center>
<%= request.getSession().getId() %>
<h1>Tomcat 2</h1>
</body>
</html>
[root@localhost ROOT]#
启动TOMCAT5和APACHE2
/usr/local/jakarta-tomcat-5.0.28/bin/startup.sh
/usr/local/jakarta-tomcat-5.0.28.2/bin/startup.sh
/usr/local/apache2/bin/apachectl start
然后用 links 127.0.0.1/test.jsp 来刷新,不停的刷,你会看到同一个页面会显示不一样的内容。这就说明你的TOMCAT集群的均衡负载功能已经完成。
5、 TOMCAT集群共享SESSION。
做为TOMCAT集群首要解决的问题就是SESSION同步,因为你不能让用户几乎每打开一个页面就要注册一次。在不同的TOMCAT上同步SESSION是我们下面要做的。
1、 安装JGroups-2.2.7.bin.zip
unzip JGroups-2.2.7.bin.zip
cd JGroups-2.2.7.bin
cp JGroups-2.2.7.bin/jgroups-all.jar $CATALINA_BASE/server/
2、 打开TOMCAT中的SESSION同步模块
vi conf/server.xml
在 host 中加入如下内容
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.1.2.3" <!—这个不是你本机的IP,是SESSION的分发IP不用更改就可以了>
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="10.218.17.59"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="synchronous"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<!—这里的三个目录都要有,否则不能正常起动。第二个TOMCAT的这三个目录最好有所分别>
</Cluster>
注意:
tcpListenAddress="10.218.17.59"
tcpListenPort="4001"
这两个设置,如果IP相同端口就不能相同,如果端口相同,IP就不能相同。
最后在conf/web.xml 中加入<distributable/>
好了。SESSION的同步做完了!
做为SESSION同步的测试,可以用TOMCAT的
http://10.218.17.59/servlets-examples/servlet/SessionExample
来做。方法是:
同时打开两个TOMCAT ,tail –f 两个TOMCAT的日志。然后用IE写个SESSION。从日志中来判断这个SESSION写到了哪个TOMCAT中去。然后把写了SESSION的TOMCAT停掉,在IE中再次写一个SESSION,如果前一个SESSION还在,则TOMCAT的集群配置就完成了!
到了这里APACHE2+TOMCAT5.0.28的集群配置就结束了!
六 college.51uc.com网站必要的设置
1、由于开发需求要安装:
ImageMagick-5.4.7-10.i386.rpm
libungif-4.1.0-15.i386.rpm
2、由于程序的网友上传文件和程序生成文件要求在多个TOMCAT上同步,所以启动NFS服务器来放置这些文件。注:在APACHE和TOMCAT的服务器上都要进行NFS的目录加载。
具体实现方法:
在/etc/fstab中加入:
10.10.10.90:/data/nfs_data on /data/nfs_data type nfs (rw,tcp,addr=10.10.10.90)
10.10.10.90:/data/nfs_data/uccollege.51uc.com/collegePhoto on /data/web_root/uccollege.51uc.com/collegePhoto type nfs (rw,tcp,addr=10.10.10.90)
10.10.10.90:/data/nfs_data/uccollege.51uc.com/download on /data/web_root/uccollege.51uc.com/download type nfs (rw,tcp,addr=10.10.10.90)
10.10.10.90:/data/nfs_data/uccollege.51uc.com/files on /data/web_root/uccollege.51uc.com/files type nfs (rw,tcp,addr=10.10.10.90)
10.10.10.90:/data/nfs_data/uccollege.51uc.com/js on /data/web_root/uccollege.51uc.com/js type nfs (rw,tcp,addr=10.10.10.90)
10.10.10.90:/data/nfs_data/uccollege.51uc.com/pim/images on /data/web_root/uccollege.51uc.com/pim/images type nfs (rw,tcp,addr=10.10.10.90)
10.10.10.90:/data/nfs_data/uccollege.51uc.com/collegeNewsPhoto on /data/web_root/uccollege.51uc.com/collegeNewsPhoto type nfs (rw,tcp,addr=10.10.10.90)
采用这种方式的原因是TOMCAT不支持软连接目录。
3、解决中文字符问题:
在tomcat的server.xml中更改
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0" URIEncoding="GBK"
protocol="AJP/1.3" />
在用户的.bash_profile中加入:
LANG=zh_CN.GB18030
LANGVAR=zh_CN.GB18030