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

Linux下通过Apache搭建Tomcat集群

2016-12-15 13:57 519 查看
集群说明:

1. 负载均衡(Load Balance):当同一客户端发起一个请求时,apache始终将请求转发到同一个节点 (sticky session),当另一个客户端或同一客户端从一个新的浏览器窗口发起请求时,apache会把请求分发到另一节点 上,依次轮询,当然,可以在apache上设置后端tomcat的分发权重。从而达到负载均衡的效果。

        

2. 高可用(High availablity):当其中一台tomcat server 突然crash时,apache会将这在进行的请求分发到集群中其他tomcat server上,由于集群member 之间已经session replication,所以原来的session 会在另外一节点上继续进行,此时,请求已发生了无缝转移,在客户端完全感觉不到故障已发生。

 

Linux下通过Apache搭建Tomcat集群
一.准备工作:
系统:CentOS release 6.2(Final)
软件:httpd-2.2.24.tar.gz
      tomcat-connectors-1.2.37-src.tar.gz
      apache-tomcat-6.0.37.tar.gz
集群分配:192.168.1.103 安装apache  tomcat-connectors
          192.168.1.22 安装tomcat22
          192.168.1.23 安装tomcat23
二.安装
1.1安装Apache   192.168.1.103
[root@localhost soft]#wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.2.24.tar.gz [root@localhost soft]#tar -zxvf httpd-2.2.24.tar.gz    //解压apache的压缩包
[root@localhost soft]#cd httpd-2.2.24     //定位到httpd-2.2.24 文件夹下
[root@localhost httpd-2.2.24]#ls     //查看显示httpd-2.2.24 文件夹下内容
[root@localhost httpd-2.2.24]#./configure --help | more    //查看安装apache配置参数
[root@localhost httpd-2.2.24]#./configure  --prefix=/opt/apache  --enable-so --enable-mods-shared=all    //  配置apache路径
[root@localhost httpd-2.2.24]#make     //编译apache
[root@localhost httpd-2.2.24]#make install    //安装apache
[root@localhost httpd-2.2.24]#cd /opt/apache   //进入apache的目录   
[root@localhost apache]#  cd conf/
[root@localhost conf]#cp -a httpd.conf httpd.conf-     //备份apache配置文件
[root@localhost conf]#vi httpd.conf 
   修改#ServerName www.example.com:80为ServerName localhost:80
[root@localhost conf]#/opt/apache/bin/apachectl -k start    //linux启动apache命令              
[root@localhost conf]#netstat -an | grep :80    //查看linux80端口是否开启
[root@localhost conf]#ps -aux | grep httpd     //linux下查看apache进程
[root@localhost conf]#cd ../..
[root@localhost opt]#cp /opt/apache/bin/apachectl /etc/rc.d/init.d/apache //拷贝apache启动脚本
[root@localhost opt]#vi /etc/rc.d/init.d/apache    // 这里是编辑apache启动脚本
  在开头的#!/bin/sh  下面加上
    #chkconfig: 2345  85  15
[root@localhost opt]#chkconfig --add apache    //添加apache服务
[root@localhost opt]#chkconfig --list apache    //列出apache服务
[root@localhost opt]#service apache stop    //停止apache服务
[root@localhost opt]#netstat -an | grep :80     //查看linux的80端口是否关闭
[root@localhost opt]#ps -aux | grep httpd     //查看是否存在httpd服务,若果之前自带httpd服务启动的话会导致新添加的apache服务启动失败
[root@localhost opt]#service apache start    //启动apache服务
[root@localhost opt]#curl 127.0.0.1
 
附:安装proxy   (httpd-2.2.24版本)
httpd-2.4.9版本无需安装proxy,安装httpd-2.4.9版本后,会自动安装proxy相关文件,在modules目录下面就有mod_proxy_balancer.so、 mod_proxy_ftp.so等相关文件,无需再单独安装proxy了(2014.07.07 补充)
进入apache源代码的modules目录 
[root@localhost opt]# cd /opt/httpd-2.2.24/modules/proxy/
[root@www proxy]# ls
[root@www proxy]# /opt/apache/bin/apxs -c -i -a mod_proxy.c proxy_util.c
[root@www proxy]# /opt/apache/bin/apxs -c -i -a mod_proxy_balancer.c mod_proxy_connect.c mod_proxy_http.c
[root@www proxy]# /opt/apache/bin/apxs -c -i -a mod_proxy_ftp.c
重启apache。
选项说明: 
-c 执行编译操作 
-i 安装操作,安装一个或多个动态共享对象到服务器的modules目录 
-a 自动增加一个LoadModule行到httpd.conf文件,以激活此模块,若此行存在则启用之 
-A 与-a类似,但是它增加的LoadModule行前有井号前缀(#) 
-e 需要执行编辑操作,可与-a和-A选项配合使用,与-i操作类似,修改httpd.conf文件,但并不安装此模块 
 
2.安装tomcat-connectors   192.168.1.103
[root@zqkj103 soft]# wget http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.37-src.tar.gz [root@zqkj103 soft]# tar -zxvf tomcat-connectors-1.2.37-src.tar.gz
 [root@zqkj103 soft]# cd tomcat-connectors-1.2.37-src
[root@zqkj103 tomcat-connectors-1.2.37-src]# ls
[root@zqkj103 tomcat-connectors-1.2.37-src]# cd native/
[root@zqkj103 native]# ls
[root@zqkj103 native]# ./buildconf.sh
如果提示:
buildconf: checking installation...
buildconf: autoconf not found.
           You need autoconf version 2.59 or newer installed
           to build mod_jk from SVN.
[root@zqkj103 native]# ./buildconf.sh
[root@zqkj103 native]# yum install autoconf
[root@zqkj103 native]# ./buildconf.sh  再次提示
buildconf: checking installation...
buildconf: autoconf version 2.63 (ok)
buildconf: libtool not found.
           You need libtool version 1.4 or newer installed
           to build mod_jk from SVN.
[root@zqkj103 native]#yum install libtool
[root@zqkj103 native]# ./buildconf.sh
[root@zqkj103 native]# ./configure --with-apxs=/usr/local/apache/bin/apxs
[root@zqkj103 native]# make
[root@zqkj103 native]# make install
 
如果成功结束,你可以在/usr/local/apache/modules/下找到mod_jk.so文件。
 
3.安装tomcat  192.168.1.22
[root@zqkj22 soft]# cd /opt
[root@zqkj22 opt]# ls
[root@zqkj22 opt]# wget http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-6/v6.0.37/bin/apache-tomcat-6.0.37.tar.gz [root@zqkj22 opt]#tar -zxvf apache-tomcat-6.0.37.tar.gz
 
4.安装tomcat  192.168.1.23
[root@zqkj23 soft]# cd /opt
[root@zqkj23 opt]# ls
[root@zqkj23 opt]# wget http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-6/v6.0.37/bin/apache-tomcat-6.0.37.tar.gz [root@zqkj22 opt]#tar -zxvf apache-tomcat-6.0.37.tar.gz
 
5.修改192.168.1.22机器上tomcat的配置
修改server.xml
<Engine name="Catalina" defaultHost="localhost">修改为
<Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat22">

<!- -
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-- >
改成:
<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="4000"
              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>
配置web.xml,增加<distributable/>元素,表示此应用将与群集服务器复制Session
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">    <distributable/>
 
 
6.修改192.168.1.23机器上tomcat的配置
修改server.xml
<Engine name="Catalina" defaultHost="localhost">修改为
<Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat23">
把<!- -
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-- >
改成:
<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"/>
<!--
注释:此处刚开始我设置的4000,可是tomcat总启动后,总是无法访问项目,遂改成了4001,则可以了。具体原因不明,不知道跟23机器上的端口是否冲突的原因。但是在22机器上,设置4000是可以的。也不知是否不能跟22机器上的端口一样
-->
 
    <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>
 
配置web.xml,增加<distributable/>元素,表示此应用将与群集服务器复制Session
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">         <distributable/>
 
7.配置Apache中的httpd.conf
打开apache安装目录下的conf/httpd.conf文件,在文件最后追加以下内容:
# Load mod_jk module 
LoadModule jk_module modules/mod_jk.so 
# Specify jk log file. 
JkLogFile /var/log/mod_jk.log 
# Specify jk log level [debug/error/info] 
JkLogLevel info 
# Specify workers.properties, this file tell jk: 
# how many nodes and where they are. 
JkWorkersFile conf/workers.properties 
# Specify which requests should handled by which node.  
JkMount /*.jsp controller
 
8.配置workers.properties
新建workers.properties     用vi命令
上述配置中:JkWorkersFile conf/workers.properties 指明由一个workers.properties文件来描述集群结点的情况,因此,我们需要创建这个workers.properties文件,并放置于 conf文件夹下,这个文件的内容如下:
 
worker.list = controller,tomcat22,tomcat23 
#========tomcat1========   
worker.tomcat22.port=8009  
# 此处的端口是指<Connector port="8009" redirectPort="8443" protocol="AJP/1.3"/>处的
worker.tomcat22.host=192.168.1.22 
worker.tomcat22.type=ajp13 
worker.tomcat22.lbfactor = 1  
#========tomcat2======== 
worker.tomcat23.port=8009    
worker.tomcat23.host=192.168.1.23 
worker.tomcat23.type=ajp13 
worker.tomcat23.lbfactor = 1  
#========controller======== 
worker.controller.type=lb 
worker.controller.balance_workers=tomcat22,tomcat23 
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
#worker.controller.sticky_session=1
 
9.建立项目测试
建立test项目,需要在项目的web.xml中添加<distributable/>
建立test2.jsp,内容如下(网上都用这个测试,我就省的麻烦了):
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App 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="test2.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>
上面的测试页面就不解释了,很好理解。
 
注:关闭22和23的防火墙,不然访问不了,或者tomcat无法正常启动,或者能访问,但是每次重新请求session都会丢失,更不能共享
service iptables stop                                 
 
原本打算用tomcat8 ,但是添加< Cluster >标签后,无法启动tomcat,遂只能改用tomcat6进行配置  ;此情况可能是路由组播造成的。当不使用默认网络eth0时,tomcat6也会出现此情况。至于tomcat8没有再具体测试。或者也有可能是防火墙未关闭(2014.07.07 补充)
 
linux 下tomcat开机自启动
修改Tomcat/bin/startup.sh 为:
export JAVA_HOME=/usr/java/jdk1.8.0_05
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export PATH=$PATH:$JAVA_HOME/bin
export CATALINA_HOME=/opt/tomcat01
/opt/tomcat01/bin/catalina.sh start
 
在/etc/rc.d/rc.local中加入:
/opt/tomcat01/bin/startup.sh
 

Linux下通过apache搭建tomcat集群.rar (21.2 KB)

下载次数: 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: