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

     今天闲来无事,就想自己搭建个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.jsp  和 http://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 下载)

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值