Tomcat的集群加Apache的负载均衡可以通过两种方式实现。第一种:通过mod_jk动态模块;第二种:通过mod_proxy。
一、通过mod_jk实现
1. 环境准备
Apache 2.2 http://httpd.apache.org/download.cgi
Tomcat 5.5 http://tomcat.apache.org/download-55.cgi
mod_jk http://tomcat.apache.org/connectors-doc/
2. 配置tomcat
可以是一台机器多个tomcat实例,也可以是多个机器,每台机器一个实例。具体根据机器的性能进行规划。下面以同一机器两个实例为例。
修改每个实例的server.xml。
实例一:
<Server port="8006" shutdown="SHUTDOWN">
...
<Connector port="8081" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
...
<Connector port="8010"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
...
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
...
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4" --广播地址,必须相同
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001" --监听端口,每个实例必须不同。
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="15000"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener
className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
实例二:
<Server port="8005" shutdown="SHUTDOWN">
...
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
...
<Connector port="8009"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
...
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
...
<!-- Include follows if cluster is needed. -->
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4002"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="15000"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener
className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
2. 配置Apache
将下载的mod_jk.so复制到Apache安装目录的modules下。修改httpd.conf文件,增加如下部分:
#load mod_jk
LoadModule jk_module modules/mod_jk.so
#config mod_jk
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
在Apache的config目录下,新建workers.properties文件,内容如下:
worker.list=loadbalancer,mystatus
#first tomcat
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
#second tomcat
worker.tomcat2.port=8010
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#balance worker
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2
worker.loadbalancer.sticky_session=1
#balance status
worker.mystatus.type=status
worker.mystatus.mount=/user/status/jk
4. 修改Web Application的web.xml文件
在web.xml文件中,增加<distributable />。
5. 启动tomcat、Apache
启动后,通过http://localhost/你的应用程序路径,进行访问。
6. 查看负载均衡状态
可以通过访问http://localhost/status查看负载均衡相关信息,包括每个服务器的状态。
7. 其他事项
可以通过Apache下的logs/error.log文件和logs/mod_jk.log文件查看错误信息,
二、通过mod_proxy实现
1. 环境准备
Apache 2.2 http://httpd.apache.org/download.cgi
Tomcat 5.5 http://tomcat.apache.org/download-55.cgi
mod_proxy apache安装完自带
2. 配置Tomcat
配置方法与mod_jk下相同。
3. 配置Apache
修改httpd.conf文件,增加如下信息:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyPass / balancer://tomcatcluster/
<Proxy balancer://tomcatcluster>
BalancerMember ajp://127.0.0.1:8009 route=tomcat1/
BalancerMember ajp://127.0.0.1:8010 route=tomcat2/
</Proxy>
<!-- balancer manager console -->
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
4. 修改Web Application的web.xml文件
在web.xml文件中,增加<distributable />。
5. 启动tomcat、apache
启动后,通过http://localhost/你的应用程序路径,进行访问。
6. 查看负载均衡状态
可以通过访问http://localhost/balancer-manager查看负载均衡相关信息,包括每个服务器的状态。
7. 其他事项
可以通过Apache下的logs/error.log文件查看错误信息。