您的位置:首页 > 运维架构 > Tomcat

Apache+tomcat集群 简易版环境搭建

2015-12-14 23:33 706 查看
今天闲来无事,就想自己搭建个tomcat集群环境试试. 网上这种例子很多,不过也是走了一些弯路,最后终于成功.记录下来.做个备忘.

主要分几步:

一) apache安装

二) apache,tomcat整合

三) 集群配置

一): apache安装

apache http server 目前最新版是2.4.17 , 官网提供下载的是源文件,还要编译后才能用, 所以我直接在官网上下载了 httpd-2.2.25-win32-x86-openssl-0.9.8y.msi

这个版本, 这是官网.msi文件里面,我找到的最新版,也是一个很常见的版本. 下载地址是 http://archive.apache.org/dist/httpd/binaries/win32/
下载后,双击安装,一路下一步,就OK了. (安装路径改一下, 我的是安装在D:\Apache2.2),里面的server name会默认自己的计算机名称.com

安装完成后,打开命令行,切换到安装目录 bin目录下,输入 httpd -v 显示出版本号,则安装成功. 且任务栏也会有一个apache的图标.

打开浏览器,在地址栏输入 http://localhost 会出现 It works! 字样, 服务已经开始工作.

二):apache,tomcat整合

apache可以解析一些静态的资源,例如css,js之类的, 动态的例如.do,.action,.jsp 需要交给app server去,我们用就是tomcat了. apache需要一个插件,和tomcat建立一个url的mapping关系,用来解析哪些请求需要交给tomcat去处理. (这里就可以利用这个,做一个动静分离了)

这个插件(模块)就是 mod_jk, 我在官网没找到现成的下载,就在网上下载了个编译好的. mod_jk-apache-2.2.3.so

注意,这个版本一定要和 apache server的版本匹配, 我本来在 网上下载了一个 mod_jk-1.2.31-httpd-2.2.x.so ,结果不能用.

下载完后,将文件copy到 D:\Apache2.2\modules , 然后修改apache的配置文件(D:\Apache2.2\conf\httpd.conf), 在最后面,加上如下内容

LoadModule jk_module modules/mod_jk-apache-2.2.3.so
JKWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
<VirtualHost *>
ServerAdmin localhost
ServerName localhost
DirectoryIndex index.html index.htm index.jsp index.action
ErrorLog logs/shsc-error_log.txt
CustomLog logs/shsc-access_log.txt common

JkMount /*WEB-INF ajp13
JkMount /*.action ajp13
JkMount /*.jsp ajp13
JkMount /*.do ajp13
JkMount /*.action ajp13

</VirtualHost>


这里要注意第一句, 是指定刚才那个插件的,名称要完全匹配, 第二句,指定了一个插件的配置文件, 最下面有些JkMount, 就是一些转发规则.

然后我们在 D:\Apache2.2\conf 下新建一个 workers.properties , 内容如下

workers.tomcat_home=d:/tomcat1
workers.java_home=D:/jdk1.7.0_80
ps=/
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13


里面的tomcat和javahome换成你自己的. 这时候,我们测算下看配置有没有错误的, 如下图



点击 TestConf, 如果黑框一闪而过,则说明没有错误,否则黑框会停留,提示错误信息.重启apache(任务栏图标点击,会有选项)

然后我们新建个web项目,就放一个test.jsp文件,部署在tomcat1下面, jsp文件内容是从网上copy的,如下

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<html><head><title>集群Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
// 如果有新的 Session 属性设置
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.println("<b>Session 列表</b><br>");
System.out.println("============================");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
名称:<input type=text size=20 name="dataName">
<br>
值:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>


启动tomcat1, 然后在地址栏输入
http://localhost:8080/test/test.jsphttp://localhost/test/test.jsp 均能正常访问, 则说明 整合成功.

三)集群配置

1).修改workers.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=9009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#========controller========
worker.controller.type=lb
worker.controller.balance_workers=tomcat1,tomcat2
worker.controller.sticky_session=0
worker.controller.sticky_session_force=true
worker.connection_pool_size=3000
worker.connection_pool_minsize=50
worker.connection_pool_timeout=50000


这些配置,都比较明了, 要注意的就是sticky_session 这个属性, 是session和tomcat的粘性问题, 如果=1,则一个session始终固定到一个tomcat节点上,这个节点挂掉,这个session的操作就挂了

2).修改httpd.conf 配置文件, 把我们在上面加的 <VirtualHost> 段,改成如下的样子.

<VirtualHost *>
ServerAdmin localhost
ServerName localhost
DirectoryIndex index.html index.htm index.jsp index.action
ErrorLog logs/shsc-error_log.txt
CustomLog logs/shsc-access_log.txt common

JkMount /*WEB-INF controller
JkMount /*.action controller
JkMount /*.jsp controller
JkMount /*.do controller
JkMount /*.action controller

</VirtualHost>
只是把 JkMount 后面的ajp13,换成了 workers.properties 里面对应的 controller

3).将刚才的tomcat1,复制一份,作为tomcat2 然后修改tomcat2配置文件.

<Server port="9005" shutdown="SHUTDOWN">

<Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="9443" />

<Connector port="9009" protocol="AJP/1.3" redirectPort="9443" />

然后在每个配置文件中,<Engine name="Catalina" defaultHost="localhost">的下面,加上下面一大段话(http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html)

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>

<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="4001"
autoBind="100"
selectorTimeout="5000"
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"/>
</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<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.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>


注意: 里面的端口4001,2个tomcat不能一样.tomcat改成4002即可.

4). 将项目test, 复制一份到 tomcat2下, 启动tomcat1,tomcat2 然后访问 http://localhost/test/test.jsp ,正常显示.

这时候后台会打印出一串===, 表明这个tomcat正在处理,如图



然后我们将正在处理的这个tomcat关掉,再来访问刚才的地址,还能正常访问,另一个tomcat后台打印,如下图



至此,简易版的tomcat集群就算完成了, 2个tomcat挂掉一个也没关系,会自动切换.

当然了,实际应用中集群要考虑的事情会很多, 例如session复制的方式,横向集群还是竖向集群(本例这种) 等等, 不过知道原理,配置起来也快.

(文中用到的 httpd-2.2.25-win32-x86-openssl-0.9.8y.msi,mod_jk-apache-2.2.3.so 和测试项目, 可以到 http://download.csdn.net/detail/qq315737546/9356073 下载)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: