文档章节

Apache+Tomcat集群搭建以及负载均衡实现

冷川
 冷川
发布于 2016/08/11 22:09
字数 2129
阅读 56
收藏 1

Apache+Tomcat集群搭建以及负载均衡实现

Apache安装及配置:http://my.oschina.net/lengchuan/blog/731412

Apache+Tomcat集成的方法有3种:

  • jk
  • jk_proxy
  • http_proxy

我们使用jk的方式。

安装

安装mod_jk

更多关于mod_jk的内容请参考:http://tomcat.apache.org/connectors-doc/。 除了apache和tomcat,我们还需要apache和tomcat的连接器mod_jk,这里就不讲解有关apache和tomcat 的安装过程了,我们看一下mod_jk的安装。

  wget http://apache.fayea.com/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.41-src.tar.gz
  tar -zxvf tomcat-connectors-1.2.41-src.tar.gz
  cd tomcat-connectors-1.2.41-src/native
  ./configure --with-apxs=/usr/local/apache2/bin/apxs #我的apache安装在/usr/local/apache2/
  make
  sudo cp apache-2.0/mod_jk.so /usr/local/apache2/modules/

配置

Apache配置

  1. 因为先安装了mod_jk模块,先配置下Apache,在apache的配置文件目录下添加:
  • 新建mod_jk的配置文件:

    sudo vi mod_jk.conf
    

    添加下面的内容:

    更多配置请参考:http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

       #指定workers.properties的位置  
       JkWorkersFile  /usr/local/apache2/conf/workers.properties
    
       #指定jk的日志输出文件
       JkLogFile  /usr/local/apache2/logs/mod_jk.log
    
       #指定日志级别  
       JkLogLevel  info
    
       #指定日志输出的时间戳格式
       JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
    
       #指定日志中时间戳后面的内容:%w:工作的tomcat实例 %V:目标ip %T:耗时
       JkRequestLogFormat "%w %V %T"
    
       #所有的jsp文件都交给worker1处理,我们可以写多个JkMount                                        
       JkMount  /*.jsp  worker1
       JkMount /*.do    worker1
    
  • 新建workers.properties,这是tomcat工作的配置文件:

    sudo vi workers.properties
    

    添加下面的内容:

    这里只是给出基本的配置,更多配置请参考:http://tomcat.apache.org/connectors-doc/reference/workers.html

       #指定需要工作的tomcat,如多个用“,”分割  
       worker.list=worker1
       #指定worker1使用ajpv13协议与Tomcat进程通讯
       worker.worker1.type=ajp13
    
       #指定worker1的位置                                        
       worker.worker1.host=localhost
    
       #指定worker1的工作端口                                
       worker.worker1.port=8009
    
       #此配置项为当Apache和Tomcat之间有防火墙时,让os每隔多久想未激活的连接发送KEEP_ALIVE信息,防止防火墙切断未激活的网络连接                                         
       worker.worker1.socket_keepalive=1                            
    
       #指定worker1上的连接在未激活的状况下持续多久,Apache将主动切断
       worker.worker1.socket_timeout=300
    
  1. 修改Apache的主配置文件httpd.conf
sudo vi httpd.conf

找到DirectoryIndex这一项,添加 index.jsp

DirectoryIndex index.html index.jsp
  1. 修改DocumentRoot
DocumentRoot "/www/lengchuan/test/"
  1. 修改< Directory >
<Directory "/www/lengchuan/test/">
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
  1. 加载mod_jk以及配置文件

我们在最后添加:

#加载mod_jk
LoadModule jk_module modules/mod_jk.so

#包含mod_jk的配置文件
Include /usr/local/apache2/conf/mod_jk.conf
  1. 检查配置文件是否正确
apachectl -t

Tomcat配置

这里我们只做简单的配置,就只是修改server.xml文件。

  1. 找到< Host >
  • 修改为:

    <Host name="localhost"  appBase="/www/lengchuan/test/"
    unpackWARs="true" autoDeploy="true">
    
  • 在< Host >后面添加:

    <Host name="localhost"  appBase="/www/lengchuan/test/"
    unpackWARs="true" autoDeploy="true">
    
    <Context path="" docBase="test1" reloadable="true" crossContext="true" />
    

测试

  1. 添加测试文件
sudo mkdir /www/lengchuan/test/test1
sudo vi /www/lengchuan/test/test1/index.jsp

输入:

Hello world!!! <%= new java.util.Date()%>
  1. 启动Tomcat和Apache
sh /opt/apache-tomcat-7.0.68/bin/startup.sh
sudo apachectl -k start
  1. 查看页面

使用ip地址:/tets1/index.jsp,比如我这里是192.168.2.87/test1/index.jsp就可以查看结果了。

负载均衡

现在我们已经把一个tomcat和Apache集成了,接下来我们来看看怎么实现负载均衡。

  • 水平集群:在不同的服务器上安装tomcat,而且只安装一个。
  • 垂直集群:在同一台服务器上安装多个tomcat。

条件限制,我们就采用垂直集群的方式。

  1. 先创建几个tomcat
sudo cp -r /opt/apache-tomcat-7.0.68/ /opt/tomcat1
sudo cp -r /opt/apache-tomcat-7.0.68/ /opt/tomcat2
  1. 修改tomcat AJP端口 我们现在已经有3个tomcat了,默认的ajp端口是8009,我们把tomcat1和tomca2的端口改为8019 和8029

修改tomcat配置文件server.xml,

  • 修改监听端口< Server >

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

    默认的端口是8005,我这里把tomcat1和tomcat2修改为8105,8205。

    • 修改HTTP服务配置

      tomcat1:

      <Connector port="8081" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />
      

      tomcat2:

      <Connector port="8082" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />
      
    • 修改ajp协议配置

      tomcat1:

      <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
      

      tomcat2:

      <Connector port="8029" protocol="AJP/1.3" redirectPort="8443" />
      
  1. 配置workers.properties

我们之前已经在workers.properties里面配置了一个tomcat,我们现在把tomcat1和tomcat2也添加进去。

sudo vi /usr/local/apache2/conf/workers.properties

添加下面的内容:

更多配置详情请参考:http://tomcat.apache.org/connectors-doc/reference/workers.html

   #指定需要工作的tomcat,如多个用“,”分割
   worker.list=controller,worker1,tomcat1,tomcat2       

   ##-------worker1------##
   #worker1是我们之前已经配置好的

   #指定worker1使用ajpv13协议与Tomcat进程通讯
   worker.worker1.type=ajp13

   #指定worker1的位置                                        
   worker.worker1.host=localhost

   #指定worker1的工作端口                                
   worker.worker1.port=8009

   #此配置项为当Apache和Tomcat之间有防火墙时,让os每隔多久想未激活的连接发送KEEP_ALIVE信息,防止防火墙切断未激活的网络连接                                         
   worker.worker1.socket_keepalive=1                            

   #指定worker1上的连接在未激活的状况下持续多久,Apache将主动切断
   worker.worker1.socket_timeout=300      

   #负载均衡因子                   
   worker.worker1.lbfactor=1                                     

   ##-------tomcat1------##
   worker.tomcat1.type=ajp13                                      
   worker.tomcat1.host=localhost                                 
   worker.tomcat1.port=8019                                       
   worker.tomcat1.socket_keepalive=1                             
   worker.tomcat1.socket_timeout=300                             
   worker.tomcat1.lbfactor=2                                     

   ##-------tomcat2------##
   worker.tomcat2.type=ajp13                                     
   worker.tomcat2.host=localhost                                 
   worker.tomcat2.port=8029                                      
   worker.tomcat2.socket_keepalive=1                             
   worker.tomcat2.socket_timeout=300                             
   worker.tomcat2.lbfactor=3                                     

   ##-------controller------##
   #controller是作为一个负载均衡控制器
   #表明这是一个负载均衡控制器                                
   worker.controller.type=lb

   #controller这个负载均衡器需要管理的tomcat列表
   #mod_jk1.2.7以前是balanced_workers,多了一个d
   worker.controller.balance_workers=worker1,tomcat1,tomcat2  

   #session管理策略,关于session管理的各种策略,这里不做讨论  
   worker.controller.sticky_session=true
  1. 配置mod_jk.conf

修改为:

   #指定workers.properties的位置  
   JkWorkersFile  /usr/local/apache2/conf/workers.properties

   #指定jk的日志输出文件
   JkLogFile  /usr/local/apache2/logs/mod_jk.log

   #指定日志级别  
   JkLogLevel  info

   #指定日志输出的时间戳格式
   JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

   #指定日志中时间戳后面的内容:%w:工作的tomcat实例 %V:目标ip %T:耗时
   JkRequestLogFormat "%w %V %T"

   #所有的jsp文件都交给controller处理,我们可以写多个JkMount                                        
   JkMount  /*.jsp  controller
   JkMount /*.do    controller
  1. 测试负载均衡
现在我们已经搭建好了3个tomcat的负载均衡,我们先来测试下。

我们新建一个session.jsp文件

```
sudo vi /www/lengchuan/test/test1/session.jsp
```

然后添加下面的内容:

```
sessionid:   <%=session.getId()%><br>
servername:  <%=request.getServerName()%><br>
serverport:  <%=request.getServerPort()%>
```

启动tomcat和Apache

```
sudo sh /opt/apache-tomcat-7.0.68/bin/startup.sh
sudo sh /opt/tomcat1/bin/startup.sh
sudo sh /opt/tomcat2/bin/startup.sh
sudo apachectl -k start
```

用浏览器访问ip:/test1/session.jsp,我们发现每次访问的时候sessionid都不尽然相同,下面我们来实现session同步的配置。

### tomcat集群配置

配置了负载均衡,我们还需要解决session同步的问题。我们采用session复制的策略,比如一个用户访问了tomcat1,我们就把这个在tomcat1产生的session复制到其它两个tomcat中去。
  1. 修改各个tomcat的server.xml,进行集群配置。找到< Cluster >部分。
更多关于tomcat集群的配置请看:<http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html>。

我们使用默认的配置,

除以之外,我们需要配置jvmRoute,因为我们这里使用的是粘性session(sticky_session),并且jvmRoute必须与worker的名字相同。

- worker1:

  ```
  <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
  ```

  ```
  <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>
  ```

- tomcat1:

  ```
  <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  ```

  ```
  <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>
  ```
  1. tomcat2:
```
  <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
```

```
  <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="4002"
  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>
```

现在重启tomcat和apache,访问ip:/test1/session.jsp,我们可以看到session已经同步了,因为我们采用的是粘性session的方式, 所以这里我们看不出来什么区别,之后会写一篇关于tomcat集群session共享的博文。

web.xml配置

通常我们的web项目都会有web.xml配置文件,我们需要在web.xml中添加一条配置来让我们的应用支持集群

<distributable/>

© 著作权归作者所有

冷川
粉丝 22
博文 18
码字总数 23332
作品 0
海淀
高级程序员
私信 提问
apache+tomcat实现集群负载

我用apache+tomcat 实现负载均衡集群 都搭建完成后 我访问 http://localhost/balancer-manager 可以进入 提示配置成功了 但我通过什么访问我的应用呢? 请教 我访问应用时会提示404错误 不知...

哈哈哦123
2011/12/01
1K
11
为什么apache+tomcat搭建的负载均衡服务器集群在部署项目后的项目路径不对呢,请求获取不到数据

为什么apache+tomcat搭建的负载均衡服务器集群在部署项目后的项目路径不对呢,请求获取不到数据 我是将项目设置在tomcat的根目录访问路径,输入localhost:8080即可访问到项目的首页,显示正常...

十六子
2015/03/11
1K
1
apache+tomcat负载均衡中springmvc项目session遇到的问题

apache+tomcat集群的负载均衡,按照网上的教程,集群的负载均衡我用的是mod_jk的模式,在同一部机器下配置成功,我用了简单的例子去跑可以实现session的复制和session内容的共享,测试截图一如...

tuzibuluo
2015/03/16
1K
3
Apache+Tomcat整合

步骤: 安装Apache基本模块 后台监控 负载均衡简单测试 配置Tomcat相关模块(AJP) 保持Session唯一,粘性会话 Tomcat集群,Session复制 1.安装Apache相关模块 负载均衡需要的主要是代理模块...

罗荣熙
2012/09/11
1K
0
Apache+Tomcat集群配置

本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置。 准备环境 Apache Apache是http服务器,我们利用其对Tomcat进行负载均衡...

嘻哈开发者
2015/07/02
130
1

没有更多内容

加载失败,请刷新页面

加载更多

对于初学者怎么学好画画?

怎样才能学好绘画?想学好绘画需求做什么?光影怎么运用?学习绘画难吗?便是不知道怎么才能绘画好自己作品的光影! 先灵魂起稿画一个大概 在根据前面几何体的理解运用在练习上 假设一个顶光...

热爱画画的我
29分钟前
4
0
Android studio初次安装启动时弹出unable to access android sdk add-on list提示的解决方法

一、问题描述 初次安装Android Studio,启动后,报错如下: unable to access android sdk add-on lis 如图: 二、原因分析 AS启动后,会在默认路径下检测是否有Android SDK,如果没有的话,...

风君子博客
43分钟前
5
0
程序员面试,为什么不跟我谈高并发?

作为一个看过几千份简历,面试过几百人的面试官,常常会看到简历中有如下文字: 对业务逻辑解耦,高并发等有比较深入的研究和丰富的开发实战经验 对解决高并发问题有深入理解 熟悉大并发技术...

程序员修BUG
47分钟前
7
0
Java中UUID版本5使用

问题 生成UUID版本5作为唯一ID。某些场景不能依赖数据库来生成唯一ID,就需要使用UUID来生成唯一性ID。 解决 Java private static final String NAMESPACE_URL = "6ba7b811-9dad-11d1-80b4...

亚林瓜子
48分钟前
7
0
js 设置焦点 判断控件是否获得焦点 判断哪个控件获得焦点

<html> <head> <title>设置焦点</title> <mce:script language ="javascript"> <!-- function init(){ var ctrl=document.getElementById("UserName"); ctrl.focus(); } // --> </mce:scrip......

前端老手
49分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部