今天花了大概两个小时完成了tomcat与apache的集群。现记录一下,也希望能帮助后来者。





建议看这篇博客前,先阅读一下鄙人拙作 tomcat整合apache

看完那个后,再进行集群,就很快了。

和之前 tomcat整合apache中的一样,这次集群用的软件版本如下:

jdk 7 ,tomcat 6.0.44,apache2.2.4,mod_jk的版本是1.2.26。

配置apache

更改apache下的httpd.conf

先把listen 80改成listen 81或者别的,大家都知道,80这个端口经常被占用的。

在最后一行添上

include "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

之后 在conf目录下再建立一个mod_jk.conf,写上

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名
JkMount /*.jsp controller

如果看完了我之前的那个博客,mod_jk的内容就很容易理解了。

大家看到conf/workers.properties这行代码了,很简单,相对路径conf下建立workers.properties

#server
worker.list = controller
#========tomcat1========
worker.tomcat1.port=18009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=28009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#========tomcat3========
worker.tomcat3.port=38009
worker.tomcat3.host=localhost
worker.tomcat3.type=ajp13
worker.tomcat3.lbfactor = 1

#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
#worker.controller.sticky_session=1

OK搞定

lbfactor是干什么的?

如果tomcat1,tomcat2,tomcat3的lbfactor分别是2,5,4那么所有的请求中2/11会分配给tomcat1处理,5/11会给tomcat2....

配置tomcat

修改端口

在这里,我先说明一点,一个tomcat有三个端口#分别是支持http1.1的connector端口,支持ajp1.3的connector端口与tomcat的Server端口#分别如下:

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
	       .......
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
 .......
<Server port="8005" shutdown="SHUTDOWN">

一般情况下,我们改动的都是8080,也就是支持http1.1协议的这端口。

今天的情况是,我们需要在一台机器上,运行三个tomcat,那么这个三个tomcat共9个端口就得全部不一样。

另外,在workers.properties里面的worker.tomcat3.port=38009这个端口也指的是tomcat的ajp端口。



我们有3个tomcat,最好就放到一起吧,如下







首先修改那9个端口号,为了清晰,tomat1的三个端口分别是18080,18009,18005,其余两个类似

修改engine

修改每个tomcat下server.xml中的engine,后面加上jvmRoute="tomcat1",当然tomcat2下的jvmRoute就是tomcat2了,注意这个tomcat1,tomcat2与workers.properties中的那个得对应。

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

加上Cluster

这个,其实不需要重新写,在engine的下面,cluster本来是被注释掉的,去掉注释即可

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

修改web.xml

将一个javaweb项目复制三份,分别放到各个tomcat/webapps下,然后修改每个项目的web.xml

给web-app根目录下加上下面一行,让这个项目支持集群。

<distributable/>

测试

在每个工程的根目录下加上一个jsp(这个jsp来自网络上)

mytest.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="mytest.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>

然后我们访问

http://localhost:81/PathTest/mytest.jsp





刷新几下,添上名称与值 能看到下面的页面:













OK,session在三个tomcat中统一了,集群搞定

几个问题

1 本来有3个tomcat,我们关闭其中一个后,假如是tomcat2,那么之后我们再刷新mytest.jsp的时候,就会发现就只有tomcat1与tomcat3在处理请求了。OK,这是符合我们猜测的。等我们重新启动tomcat2后,再刷新,发现请求还是没有发到tomcat2中#如果我们重新启一个session(就是再开一个浏览器)发现请求在三个tomcat中又能循环处理了#

 这说明,tomcat的请求分发机制是:对于某个session,先检查有哪些tomcat可以处理,第一次有三个,那么就用这三个处理;如果某次检查的时候,发现某个tomcat不能用了,那就让session记住它,请求以后就不给那个tomcat了,即使后面这个tomcat又能用了,依旧不给他 说白了,你拒绝我一次,我tm以后都不找你了!但是另起一个session后,两个浏览器就都OK了#可以理解为:"听我姐妹说,你可以,那么就再给你一次机会喽"~~~~

以上为charyle的理解。具体评述见http://www.iteye.com/topic/1017961

2 大家不要忘记,我在PathTest这个项目里,还有几个带图片的jsp,大家看看

http://localhost:81/PathTest/jsp/a.jsp

我们访问,这个地方,找不到图片

怎么办?

把mod_jk改成下面的样子。

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties

 # 设置虚拟主机,定义端口为81
 <VirtualHost 127.0.0.1:81>
     ServerName 127.0.0.1
     DocumentRoot "E:/cluster/tomcat1/webapps"
     #定义站点项目所在路径,把路径指向 tomcat 中的默认网站目录
     DirectoryIndex index.html index.htm index.jsp
     ErrorLog logs/shsc-error_log.txt
     #指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名
JkMount /*.jsp controller

 </VirtualHost>

关于VirtualHost还有整体的apache的配置,我不是很清楚,总之上面这种配置能解决找不到jpg的问题。

///////////以下是2016-8-16日修改

很惭愧,发现大家用的都是tomcat8或tomcat7,我这还是6,但是也懒得再去升级了

大家看这个博客吧:

http://blog.csdn.net/flyliuweisky547/article/details/21293071

上面的是tomcat8与apache的集群

如果tomcat要把session放到redis里,再看看下面这博客

http://blog.csdn.net/caiwenfeng_for_23/article/details/45666831

///////////以上是2016-8-16日修改

参考资料

http://www.iteye.com/topic/1017961

apache tomcat集群的更多相关文章

  1. Apache + Tomcat集群配置详解 (1)

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

  2. (转)Apache+Tomcat集群配置

    本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache Apache是ht ...

  3. 实战Apache+Tomcat集群和负载均衡

    实战Apache+Tomcat集群和负载均衡 目录 1.    什么是J2EE集群... 3 1.1.     序言... 3 1.2.     基本术语... 3 伸缩性(Scalability): ...

  4. Apache+tomcat集群配置

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

  5. apache + tomcat 集群

    apache2.2与tomcat集成(可以多个tomcat) 需求概况: 有3个服务: localhost:9091, localhost:9190. localhost:9191分别对应3个tomc ...

  6. Linux+Apache+Tomcat集群配置

    参考: http://blog.csdn.net/bluishglc/article/details/6867358# http://andashu.blog.51cto.com/8673810/13 ...

  7. ngnix apache tomcat集群负载均衡配置

    http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...

  8. apache tomcat 集群! (转)

    公司需要一个内部测试局域网, 要求可以支持3000并发访问!以前也没做过服务器这方面.临时抱佛脚,查看了N多文档,他人经验,布置好之后,又遇到了N多问题,功夫不负有心人.终于还是完成了要求!观他人的布 ...

  9. apache tomcat 集群!

    公司需要一个内部测试局域网, 要求可以支持3000并发访问!以前也没做过服务器这方面.临时抱佛脚,查看了N多文档,他人经验,布置好之后,又遇到了N多问题,功夫不负有心人.终于还是完成了要求!观他人的布 ...

随机推荐

  1. comtypes加word 2013批量将pdf转换为doc

    office 2013很强大. import os import sys import re import comtypes.client wdFormatPDF = 17 def covx_to_p ...

  2. Lucene查询结果高亮

    检索结果高亮 实现效果: 核心代码 package ucas.ir.lucene; import java.io.File; import java.io.IOException; import ja ...

  3. cassandra 常见问题

    摘要 本文主要介绍在部署cassandra集群以及使用cassandra过程中遇到的一些问题. 文章只发布在CSDN 和个人站点 更多nosql文章可以访问stone fang 个人主页 正文 Q1: ...

  4. 改进版getpass库

    编程伊始 正式实施 改进版 源码 以数字显示 以自定义分隔符delimiter显示 如何使用 下载及安装 在您的代码中使用 源码下载 总结 用过Linux的都知道,尤其是进行使用包管理软件类似于apt ...

  5. Unity UGUI图文混排(七) -- 下划线

    之前更新超链接的时候,忘了搭配实现一个下划线的功能,这篇文章就是来补上这一个功能,时间有点长,一方面没有很好的思路,一方面也没多少时间. 先在网上收集了一下下划线的实现操作,一种是在文本下再创建一个文 ...

  6. Web自动化框架LazyUI使用手册(3)--单个xpath抓取插件详解(selenium元素抓取,有此插件,便再无所求!)

    概述 前面的一篇博文粗略介绍了基于lazyUI的第一个demo,本文将详细描述此工具的设计和使用. 元素获取插件:LazyUI Elements Extractor,作为Chrome插件,用于抓取页面 ...

  7. C++ 虚函数表 单继承

    本文研究单继承情况下,c++对象的虚函数表的具体情况. 假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2. 测试的代码如下: #include<iostrea ...

  8. JSP自定义方法库

    如果JSTL的方法库没有满足需要,可以使用自定义方法进行扩展 public class Function{ public static int length(Object obj){ //返回对象的长 ...

  9. 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

    一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...

  10. C++中所有的变量和函数都必须有类型

    /* C++中所有的变量和函数都必须有类型 C语言中的默认类型在C++中是不合法的 函数f的返回值是什么类型,参数又是什么类型? 函数g可以接受多少个参数? */ //更换成.cpp就会报错 f(i) ...