admin 管理员组

文章数量: 1184232


2023年12月17日发(作者:精品破解软件分享)

轻松实现Apache,Tomcat集群和负载均衡

0, 环境说明

Apache :apache_2.0.55 1 个

Tomcat: apache-tomcat-5.5.17 (zip版) 2个

mod_jk:: mod_ 1个

第一部分:负载均衡

负载均衡,就是apache将客户请求均衡的分给去处理

1.安装apche,tomcat

/ 下载Apache 2.0.55

/ 下载tomcat5.5 zip版本(解压即可,绿色版 /tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/ 下和 apache版本匹配

按照jdk,我的路径为:E:ideapacheApache2

解压两份Tomcat, 路径分别为 E:idetomcat1,E:idetomcat2

下载mod_jk

2.修改Apache配置文件

在apache安装目录下conf目录中找到

在文件最后加上下面一句话就可以了

include "E:ideapacheApache2confmod_"

2. 同目录下新建mod_文件,内容如下

#加载mod_jk Module

LoadModule jk_module modules/mod_

#指定 ties文件路径

JkWorkersFile conf/ties

#指定那些请求交给tomcat处理,"controller"为在tise里指定的负载分配控制器JkMount /*.jsp controller

3.在同目录下新建 ties文件,内容如下

= controller,tomcat1,tomcat2 #server 列表

#========tomcat1========

=8009 #ajp13 端口号,在tomcat下配置,默认8009

=localhost #tomcat的主机地址,如不为本机,请填写ip地址

=ajp13

or = 1 #server的加权比重,值越高,分得的请求越多

#========tomcat2========

=9009 #ajp13 端口号,在tomcat下配置,默认8009

=localhost #tomcat的主机地址,如不为本机,请填写ip地址

=ajp13

or = 1 #server的加权比重,值越高,分得的请求越多

#========controller,负载均衡控制器========

=lb

ed_workers=tomcat1,tomcat2 #指定分担请求的tomcat

_session=1

4.修改tomcat配置文件

如果你在不同电脑上安装tomcat,tomcat的安装数量为一个,可以不必修改tomcat配置文件

我这里是在同一台电脑上安装两个tomcat,所以需要更改其中一个的设置

打开tomcat2/conf/文件

5.编写一个测试jsp

建立一个目录test.里面新建一个,内容为

<%

n("===========================");

%>

把test放到tomcat1,tomcat2的webapps下

6.启动apache,tomcat1,tomcat2,进行测试

通过 localhost/test/ 访问,查看tomcat1的窗口,可以看到打印了一行"====再刷新一次,tomcat2也打印了一条,再刷新,可以看到请求会被tomcat1,tomcat2轮流处理,实

第二部分,配置集群

只配置负载均衡还不行,还要session复制,也就是说其中任何一个tomcat的添加的sessio它tomcat, 集群内的tomcat都有相同的session

1. 修改tomcat1, tomcat2的,将集群部分配置的在注释符删掉,并将tomcat2的4001免与tomcat冲突,当然,如果是两台电脑,是不用改端口的,去掉注释符即可

2,修改测试项目test

修改,内容如下

<%@ page contentType="text/html; charset=GBK" %>

<%@ page import=".*" %>

Cluster App Test

Server Info:

<%

n(alAddr() + " : " + alPort()+"

");%>

<%

n("

ID " + ()+"

");

// 如果有新的 Session 属性设置

String dataName = ameter("dataName");

if (dataName != null && () > 0) {

String dataValue = ameter("dataValue");

ribute(dataName, dataValue);

}

("Session 列表");

Enumeration e = ributeNames();

while (eElements()) {

String name = (String)ement();

String value = ribute(name).toString();

n( name + " = " + value+"

");

n( name + " = " + value);

}

%>

名称:

值:

然后在test 新建WEB-INF目录,WEB-INF下新建,内容如下

TomcatDemo

注意:在你的应用的加入 即可

ok,讲test复制到tomcat1,tomcat2的webapps下,重启apache,tomcat1,tomcat2,

输入网址 localhost/test/

新建一个 名称为 xiaoluo ,值为 cdut 的session,提交查询,新开一个ie窗口,再提交查询,个tomcat 是负载均衡,并且session同步的

Tomcat1:

type="tabase"

description="User database that can be updated and saved"

factory="UserDatabaseFactory"

pathname="conf/" />

connectionTimeout="20000"

redirectPort="8443" />

channelSendOptions="6">

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"

mapSendOptions="6"/>

port="45564"

frequency="500"

dropTime="3000"/>

port="4001"

selectorTimeout="100"

maxThreads="6"/>

className="eDispatch15Interceptor

className="hputInterceptor"/>

filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

resourceName="UserDatabase"/>

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false">

Tomcat2

SSLEngine="on" />

className="ResourcesLifecycleListener" />

type="tabase"

description="User database that can be updated and saved"

factory="UserDatabaseFactory"

pathname="conf/" />

connectionTimeout="20000"

redirectPort="8443" />

channelSendOptions="6">

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"

mapSendOptions="6"/>

className="ervice"

address="228.0.0.4"

port="45564"

frequency="500"

dropTime="3000"/>

className="eiver"

address="auto"

port="4002"

selectorTimeout="100"

maxThreads="6"/>

className="ationTransmitter">

className="ParallelSender"/>

className="lureDetector"/>

className="eDispatch15Interceptor"/>

className="hputInterceptor"/>

filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/>

className="rDeployer"

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

className="rSessionListener"/>

resourceName="UserDatabase"/>

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false">

网友评论:

2

3

看测试结果图就知道了,_session=true,是可以复制的。自己可以实践看看。

tomcat 是全局session复制,集群内每个tomcat的session完全同步(也就是任何时候都完全一样的)

在大规模应用的时候,用户过多,集群内tomcat数量过多,session的全局复制就会有问题,

因此,建议tomcat的数量不要太多,5个以下为好。

4

我按照你的步骤在打印=====的时候,为什么不是tomcat1,tomcat2轮流处理,只是在一个tomcat的窗口上打印,当我关掉一个tomcat以后,另一个才可以看到打印"=========="我想问下是为什么.急请教..谢谢!!!

5

恭喜你成功了!!

第一点, 这说明你实现了session复制

第二点,同一个ie窗口的请求,默认是让一个tomcat来处理的

第二个人请求,会均衡的让其它tomcat来处理

你关掉ie,重新再访问一下,第二个tomcat就会打印====了

本质的说,同一个ie窗口的请求,也就是和服务器的一次会话(session),sessio没有清掉的时候,是会让同一个tomcat处理的

session失效后,再次建立和服务器的会话,这样就会分配新的tomcat来处理

6

不是的,我session还没调,我就做了负载均衡,我打开测试页面做测试的时候,都是同一个TOMCAT在处理,我关掉IE再打开还是一样. 但是当我关掉一个TOMCAT,再刷新的时候另一个TOMCAT才会打印====号.可能我昨天描述的不准备,让你误解了...不好意思.我想问你一下, 这种情况该如何解决呢!!!真的比较急!!!

7

你是否加了 jvmRoute呢?????

如果是的话,那么你的结果就是正确的了

如果你配置了jvmRoute,

这跟session复制没有关系,一次会话,就有一个sessionID,这个sessionID后面会跟上jvmRoute设置的值,所以一次会话,会让同一个tomcat处理

后面的session复制,只是在刚才的基础上,让session在每一个tomcat都有一份拷贝,各个tomcat的session是同步的

8

我想问下不知道为什么,我复制就是不能成功,你能再详细一点吗?

14

21

我的怎么不好用啊 sessionid不固定 两个页面有两个sessionid 请问大家怎么回事

23

请问 我配置 apache服务器后 ,页面 在 访问后无法 显示 图片,以及样式表失去作用。这是怎么回事,需要做那些配置 ,请指点。

24

我按照配置了一下,负载成功了,可是复制session有问题,怎么也不会复制,不知道有可能是哪里没有设好?

25

我也配制了,负载也成功了,也在复制session那个地方出问题了,我不知道是哪里出了错!看您的文章,在添加jvmRoute那个地方看不懂,我觉得那个地方您写的不是很清楚!能给我解答一下吗?

28

不好意思,我把改成就好了,但是并没有出现你图上tomcat日志所打出来的内容。

29

非常感谢 照你的方法可以了 但是 能不能挂个tomcat 在挂个resin呢 又是怎么设置的呢 在着这个 均衡应该有参数的 我应该在那配置呢 能不能给我讲讲哦

30

用apache proxy而不用jkmod不行的原因可能因为apache proxy还没有做到.jsp级别的识别,只到到目录级别.

31

33

我的session不能相互复制,不知道为什么?我把test放在两个tomcat目录下,还防在apache下的htdocs目录下,才能不指定端口访问test的内容。

35

你好!

很感谢你的这篇文章。

有一个问题想请教您一下:

我在配置过程中,负载均衡一直失败。即apache一直不能将一个用户的请求分配到两个服务器结点上。请问这是什么问题呢?我需要注意哪些配置?

诚望得到您的帮助,小弟我为这事做了快一个星期了 - -

37

zcm790619

回答:zcm790619

JkMount /* controller

表示把所有的请求都发到tomcat

如果要具体如action可以这么写:

JkMount /*.action controller

38

39

上面的大哥,你写的文章真棒,但还是有个问题想问下你们啊:

几个不同的tomcat在实现群集session复制的时 候,session里面设置的值好像不能被复制,比如:ribute("username","zenghao"),当请求

在同一个tomcat里面的时候,可以得到并打印出session里面的username值,当请求被分配到另一个tomcat中的时候,我却得不到 username得数值.但是,在不同tomcat之间打印得sessionid相同.

请问下,这是怎么个回事啊?如果是这样的话,那我有一个首 页是由几个frame框架组成的,每个frame框架在主页面加载的时候都会请求不同的tomcat,登陆时候人员id会被设置到session中,这样 子的话跳转到首页,有的frame肯定会说找不到登陆人员id!肯定又说登陆不成功啦1

请大家帮个忙怎么解决,是配置的问题还是什么?跪求!!

41

42

我按照你上面所写配置文件,再加上include "D:Apache

GroupApache2confmod_",结果apache就不能启动了,如果去掉这段就可以启动,这是怎么回事?

43

45

LZ 谢谢你的文章。这二天我配置了下。tomcat集群实现了。可是session却无法同步。

在不同的窗口可以看到不同的sessionID

新建一个 名称为 xiaoluo ,值为 cdut 的session,提交查询,新开一个ie窗口,再提交查询,如图,可以看到,两个tomcat 是负载均衡,并且session同步的

我在我的tomcat日志里却看不到LZ图里的信息。只能看到分别打印的信息。我的tomcat 在不同的机器的。

楼主帮我看看是为什么?配置文件与楼主差不多。


本文标签: 配置 复制 请求 时候 目录