WINDOWS 下apache与tomcat6集成
准备工作:
1.下载apache_2.2.4-win32-x86-no_ssl.msi 下载地址http://httpd.apache.org/ 需要自己找或者度娘;
2.下载jk_mod.so下载http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/
对应的版本tomcat-connectors-1.2.32-windows-i386-httpd-2.2.x.zip 根据这个包可以知道,1.2.32对应的httpd为2.2.x的,不然会有想不到的问题;
3.下载jdk1.6安装就不介绍了,一般完这个的都会;
4.下载tomcat6 下载地址为:http://tomcat.apache.org/download-60.cgi,地址有时候会变动,请根据实际情况下载;
一般来说,实现Apache与Tomcat6的负载均衡有两种方式,一种是使用mod_jk,另一种是使用mod_proxy模块。本文只讨论mod_jk方式。
无论使用哪种方式,一般都要经过以下这几个步骤(同一台机器):
- 修改startup.bat中的CATALINA_HOME变量的值。因为每个Tomcat实体的CATALINA_HOME都是不一样的,如果设置为系统的环境变量,那么在启动这几个Tomcat时就会出问题。
- 设置不同的Tomcat服务器(启动)端口
- 对不同的Tomcat实体设置不同的AJP connector
- 停止Coyote HTTP/1.1 连接器(Http请求交给Apache Http Server处理)
- 在Standalone Engine中设置jvmRoute
- 注释掉Catalina Engine
- 在worker.properties中配置Tomcat worker
下面来详细说下详细的配置步骤
1.在Tomcat startup.bat中修改CATALINA_HOME的值
注:这一步跟负载均衡没关系,没有负载均衡也要进行这一步
首先下载Tomcat6.*.*.zip,解压后进行重命名,复制三个,分别是Tomcat6A,Tomcat6B,Tomcat6C名字可以修改,不过需要跟后面的对应不然会出问题
startup.bat只是在.zip格式的Tomcat压缩包里才有,使用安装包安装的好像没有。找到这个文件,打开后修改
1.对与Tomcat6A:
set CATALINA_HOME=%CURRENT_DIR%为set CATALINA_HOME= E:\tomcat\Tomcat6A、
2.对于Tomcat6B:
set CATALINA_HOME=%CURRENT_DIR%为set CATALINA_HOME= E:\tomcat\Tomcat6B、
3.对于Tomcat6C:
set CATALINA_HOME=%CURRENT_DIR%为set CATALINA_HOME= E:\tomcat\Tomcat6C、
如果没有找到可能是因为有引号一样的修改方式参考:
set “CATALINA_HOME=%CURRENT_DIR%”改为set "CATALINA_HOME=E:\tomcat\Tomcat6A"
2.设置不同的服务器端口
注:这一步与负载均衡没有直接关系,是为了处理多个Tomcat的问题,如果这些Tomcat分布在不同的机器上,应该不会有这个问题
打开三个tomcat下面的conf/server.xml,找到下面这个标签:
<Server port="8005" shutdown="SHUTDOWN" debug="0">
在本例中, Tomcat6A使用8005端口
Tomcat6B使用8006端口
Tomcat6C使用8007端口
3.设置Tomcat中的AJP连接器接口
注:这是第一步跟负载均衡直接相关的步骤
打开三个tomcat下面的conf/server.xml,找到这样一个xml标签:
<!--Define an AJP1.3 connector on port 8009-->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443">
在本例中, Tomcat6A使用8009端口
Tomcat6B使用8010端口
Tomcat6C使用8011端口
4.停止监听默认的Http/1.1连接器
注:这步也是和负载均衡直接相关,但不是负载均衡中的关键,只是个副产品(byproduct)
为了防止人们直接访问某个Tomcat(因为这样会使负载均衡器失去意义),所以我们要关掉它的HTTP连接器,使得这些Tomcat只能通过AJP协议接收Apache转发过来的请求,因此需要停止HTTP/1.1连接器
打开三个tomcat下面的conf/server.xml,像下面的代码这样注释掉HTTP/1.1连接器的监听
<!--Define
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443 />"
-->
5.在Standalone Engine中设置jvmRoute属性
注:这是实现负载均衡的关键一步,这一步做了两件事,一是配置了Standalone Engine,二是赋予这个Engine一个id:jvmRoute
每个Tomcat worker的conf/server.xml中都有有关Engine的配置(语句)。这个Engine是一个和Catalina Engine一样级别最高的Engine,代表整个Catalina Servlet Engine。这条配置语句在conf/server.xml中,jvmRoute的值必须是唯一的,在本例中,各个Tomcat实例的配置如下
Tomcat6A:
<!--You should set jvmRoute to support load-balancing via AJP-->
<Engine name="Standalone" defaultHost="localhost" jvmRoute="Tomcat6A">
Tomcat6B:
<!--You should set jvmRoute to support load-balancing via AJP-->
<Engine name="Standalone" defaultHost="localhost" jvmRoute="Tomcat6B">
Tomcat6C:
<!--You should set jvmRoute to support load-balancing via AJP-->
<Engine name="Standalone" defaultHost="localhost" jvmRoute="Tomcat6C">
6.注释掉Catalina Engine
注:这一步其实可以和上一步合并
因为我们在tomcat上配置了Standalone Engine,因此需要注释掉Catalina Engine。具体做法是:在conf/server.xml中找到相应代码进行注释,结果如下:、
<!--
<Engine name=-"Catalina" defaultHost="localhost">
-->
7.在httpd.conf中配置Tomcat与Apache
注:粗体字为与负载均衡有直接关系的配置语句
1.在Apache Http Server下的conf文件夹中打开httpd.conf,添加下面的语句到其末尾
Include conf/mod_jk.conf
2. 在apache的conf下面创建mod_jk.conf,并添加内容,以下是我配置的原样:
#加载mod_jk Module这里可能会找不到mod_jk.so,需要手动添加进来
LoadModule jk_module modules/mod_jk.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#打印日志等级
JkLogLevel error
#日志查看地址可以自己设置
JkLogFile "D:\Program Files\Apache Software Foundation\Apache2.2\logs "
#对所有的请求进行分流
JkMount /examples/jsp /* controller
JkMount /jkstatus/ status1
3. 在apache的conf下面创建workers.properties文件,并添加内容
以下内容是我配置的原样本:按此段第二条的的配置位置创建
worker.list=controller,status1
worker.Tomcat6A.type=ajp13
worker.Tomcat6A.host=10.0.0.53
worker.Tomcat6A.port=8009
worker.Tomcat6A.lbfactor=10
worker.Tomcat6B.type=ajp13
worker.Tomcat6B.host=10.0.0.53
worker.Tomcat6B.port=8010
worker.Tomcat6B.lbfactor=10
worker.Tomcat6C.type=ajp13
#tomcat的主机地址,如不为本机,请填写ip地址
worker.Tomcat6C.host=10.0.0.53
#ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.Tomcat6C.port=8011
#server的加权比重,值越高,分得的请求越多
worker.Tomcat6C.lbfactor=10
worker.controller.type=lb
worker.controller.sticky_session=1
worker.controller.balance_workers=Tomcat6A,Tomcat6B,Tomcat6C #每次增加个tomcat 需要在这里添加一个,这里的名字对应上面的名字
worker.status1.type=status #这里是看配置查看apache负载的详细情况的
说明:在workers.proterties中每一个Tomcat实例一般有这几个属性需要配置,分别是:
type(类型):
一般有ajp13(代表Tomcat的worker),lb负载
host(主机): Tomcat所在机器的ip地址(这里的host值就是自己机器的ip地址,需要查看自己的机器的ip地址来替代这个地址)
port(端口): worker所监听的端口号
lbfactor(负载权重):影响负载均衡器在分发请求时所分配的请求数,相对大小更重要
sticky_session属性设为1,这样负载均衡器lb就会尽量保持一个session,也就是使用户在一次会话中跟同一个Tomcat进行交互。(我猜如果不能保持跟同一个Tomcat进行交互,也就不能保持一个session)。
balance属性可以告诉mod_jk模块那些worker由lb负载均衡器控制
8.测试配置是否成功
在Tomcat的目录下找到webapps/examples/jsp/目录下创建一个index.jsp文件,内容如下:
TomcatA
<%@page language="java"%>
<html>
<body>
<h1>Index Page Of Tomcat6A</h1>
</body>
</html>
其他两个Tomcat所做的操作类似,只是index.jsp中的内容变了一下,分别是:
TomcatB:
<%@page language="java"%>
<html>
<body>
<h1>Index Page Of Tomcat6B</h1>
</body>
</html>
TomcatC:
<%@page language="java"%>
<html>
<body>
<h1>Index Page Of Tomcat6C</h1>
</body>
</html>
配好后,重启Tomcat和Apache Http Server,顺序为 关闭Apache->关闭Tomcat->启动Tomcat->启动Apache
在浏览器中输入http://localhost/examples/jsp/index.jsp,然后运行多个浏览器实例(同一个浏览器的标签式浏览不行,因为很多标签式浏览被设置为共享session),如果出现不同的页面,就说明负载均衡配置成功了。
在浏览器中输入http://localhost/jkstatus/,,将出现目前负载情况的统计资料,如下图所示:
8.异常信息
安装的时候总会有点小问题:
1.apache启动的时候报错:the requested operaion has failed!
原因一:80端口占用
例如IIS,另外就是迅雷。我的apache服务器就是被迅雷害得无法启用!
原因二:软件冲突
装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp属性->高级->WINS标签把netbios的lmhosts对勾去掉,禁用tcp/ip的netbios. 然后再启动应该就可以了。
原因三:httpd.conf配置错误
如果apache的配置文件httpd.conf搞错了,在windows里启动它,会提示the requested operation has failed ,这是比较郁闷的事,因为查错要看个半天。
其实可以用命令行模式启动apache,并带上参数,apache会提示你哪句有误,然后就可以针对性的解决,命令如下: httpd.exe -w -n "Apache2" -k start
还有一种情况:
即使你这次启动了,下次你都有可能启动失败
在运行里输入:netsh winsock reset
一会儿cmd会提示你重启,不用理会,现在APACHE已经可以启动了。
其实就是一个winsock的修复
2.路径问题:httpd.exe:Syntax error on line
这个是配置问题,根据提示一般能解决问题的
其中我就碰到了配置文件问题,参考文档里面有个单词少了一个,害的我停止了半天,不过还是谢谢他的文档,至少大部分都没有问题,在他的基础上做了小小改动,所以为了自己学习的历史长河,记录下这个小小的浪花;
3.apache修改端口,找到httpd.conf里面的:Listen 80 修改为对应的Listen 8088就OK 了