apache+tomcat集群实现负载均衡

这篇文章主要记录在MAC OSX(Yosemite)下搭建apache+tomcat集群环境的过程,其它Linux发行版除了安装apache和mod_jk不一样,其它步骤完全一样。





1.安装apache,可以参照我的另一篇博客 Linux安装Apache,目前MAC OSX(Yosemite)是自带apache的,你可以通过命令sudo apachectl start|stop|restart等方法来启动停止或重启apache服务,启动完后只需在浏览器中输入http://localhost,如果出现it works,则表明启动成功。

2.安装mod_jk,这是apache的一个模块,专门负责连接tomcat, jboss等java容器,下载地址 http://tomcat.apache.org/download-connectors.cgi,MAC OS10.10 Yosemite上安装跟官网不太一样,参考 http://pablotips.blogspot.sg/2015/01/compiling-modjk-on-mac-os-x-1010.html

3.整合apache2和mod_jk,找到apache2的安装目录下的httpd.conf文件,不同操作系统目录不一样,自己去查,MAC在/etc/apache2/目录下,在文件最后加上
# Add and load the mod_jk module
Include /etc/apache2/other/mod_jk.conf

这个mod_jk.conf是我们接下来要创建的,它的作用是打开apache的mod_jk模块

4.切换到/etc/apache2/other/目录,创建mod_jk.conf文件,内容如下
#Load mod_jk module
LoadModule jk_module /usr/libexec/apache2/mod_jk.so
#Where to find workers.properties
JkWorkersFile /etc/apache2/other/workers.properties
#Where to put jk logs
JklogFile /etc/apache2/other/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 indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
#JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# All requests go to controller by default
JkMount /* controller
# Serve html, jpg and gif using httpd
JkUnMount /*.html controller
JkUnMount /*.jpg  controller
JkUnMount /*.gif  controller


关于以上配置文件中各参数含义,请参考 http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html,请注意,以上配置中包含了worker.properties文件,这个是mod_jk模块连接tomcat用的,下面我们来创建该文件

5.在/etc/apach2/other/下面创建worker.properties,内容如下

worker.list=controller

#tomcat1
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1

#tomcat2
worker.tomcat2.port=8010
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1

worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1


关于以上配置文件各参数,请参考 http://tomcat.apache.org/connectors-doc/reference/workers.html,这里我只配置了两台tomcat,如果想用多台,在这边增加配置就好了。
#sticky_session这个属性需要特别注意,如果是true的话,你的所有request会一直发到同一台server上,如果这台server挂掉,request并不会转发到其它正常的server上,false时则会自动转到其它server上。

6.准备两份tomcat,我这里用的是版本是7.0.6,第一份tomcat端口保持不变,修改第二份server.xml中相应的端口号,保证跟第一份不重复,最简单的就是每个端口号加1,然后为每个tomcat指定jvmRoute,设置如下
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">,
分别为tomcat1,tomcat2,对应worker.properties中的配置,同时需要把Cluster节点的注释打开,至此,你在浏览器中输入http://localhost/项目名称,就可以访问你的项目了。

7.但上面的方案还没有实现session共享,为了实现session复制需要做两步,
(1)在项目的web.xml中<web-app>节点内添加节点<distributable/>,这是一个自闭合的空节点,告诉tomcat去分发session。
(2)将tomcat的server.xml文件中的Cluster节点修改为如下配置
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
	channelSendOptions="6">

	<Manager className="org.apache.catalina.ha.session.BackupManager"
		expireSessionsOnShutdown="false" notifyListenersOnReplication="true"
		mapSendOptions="6" />
	
	<Channel className="org.apache.catalina.tribes.group.GroupChannel">
		<Membership className="org.apache.catalina.tribes.membership.McastService"
			address="228.0.0.4" port="45564" frequency="500" dropTime="3000" />
		<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
			address="auto" port="5000" selectorTimeout="100" maxThreads="6" />

		<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
			<Transport
				className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
		</Sender>
		<Interceptor
			className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
		<Interceptor
			className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
		<Interceptor
			className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" />
	</Channel>

	<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
		filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt" />

	<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
		tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/"
		watchEnabled="false" />

	<ClusterListener
		className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>

以上配置来自官方文档,可直接复制到项目中,至此,配置完成

猜你喜欢

转载自995215629-qq-com.iteye.com/blog/2216473