win下安装apache和tomcat集群

最近在学习tomcat的东西,源码调试啊,debug启动啊,http请求接收处理啊之类的。还有些改造、性能优化、功能扩展之类的比较复杂,我知道得一点一点来。
前两天网上查找学习终于在win下搭建完成了apache2.2+tomcat8.0.22的集群。
话不多说,记录一下,以后容易温故知新。

apache只有处理静态事物的能力,而tomcat的强项就是处理动态的请求,所以apache和tomcat整合相互取长补短,由apache作为入口,如果是请求静态页面或者是静态文件,由apache直接提供,如果是请求动态页面,则让apache分发到tomcat,由tomcat处理以后再响应给客户端。

首先,去官网下载这里写图片描述
双击安装,一步一步安装完成之后这里写图片描述
start就启动了。
在浏览器下输入 http://localhost ,看到 ”It works” ,表明 Apache 安装成功 。
注意:apache默认是80端口,如果80端口被占用,则无法安装成功;
1、查询80端口被哪个进程id占用,netstat -aon|findstr “80”
如果有:这里写图片描述

2、查询该进程id是代表哪个进程,tasklist|findstr “24644”这里写图片描述

下面部署tomcat集群,我解压了两份tomcat这里写图片描述

创建一个项目用于测试,在每一个tomcat下面的webapps下创建文件夹TestCluster,把ROOT下面的WEB-INF文件夹考进去,
新建index.jsp,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.text.SimpleDateFormat"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>TestCluster</title>
  </head>
  <body>
        Server Info:
    <%
      String dtm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
      System.out.println("["+request.getLocalAddr()+":"+ request.getLocalPort()+"]" + dtm);
      out.println("<br>["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + dtm+"<br>"); 
    %>
    Session Info:
    <%
        session.setAttribute("name","dennisit");
        System.out.println("[Session Info] Session ID:"+session.getId());
        out.println("<br>[Session Info] Session ID:" + session.getId()+"<br>");
    %>
  </body>
</html>

记录一下请求的信息和session ID,之后可以依靠这些信息来判断集群是否成功。

另外,在web.xml中的在 < /web-app> 上面添加 < distributable/>
(设置< distributable />,即表明集群下某一节点生成或改变的 Session ,将广播到该集群的其它节点)
然后就是修改两个tomcat的server.xml
第一个tomcat配置:
< Server port=”7005” shutdown=”SHUTDOWN”>
< Connector port=”7080” protocol=”HTTP/1.1”
connectionTimeout=”20000”
redirectPort=”8443” />
< Connector port=”7009” protocol=”AJP/1.3” redirectPort=”8443”/>
在 Engine 标签内添加 jvmRoute属性,将其设置为Tomcat3,
将 Cluster标签的注释打开.
第二个tomcat相应配置,记得端口和名称不同就行。

启动tomcat集群试试,如果配过TOMCAT_HOME,请删除,不然会产生混乱。
分别启动两个tomcat,
浏览器中输入http://localhost:7080/TestCluster/index.jsp
输出信息:
Server Info:
[0:0:0:0:0:0:0:1:7080]2015-08-13 06:51:29
Session Info:
[Session Info] Session ID:7881D398B111CEB731DD86E3035C65ED.Tomcat3
输入:http://localhost:9090/TestCluster/index.jsp
输出信息:
Server Info:
[0:0:0:0:0:0:0:1:9090]2015-08-13 06:53:05
Session Info:
[Session Info] Session ID:7881D398B111CEB731DD86E3035C65ED.Tomcat2
可以看到两个tomcat的sessionId是一样的,说明这两次请求对两个tomcat来说是对等的。

接下来要整合apache和tomcat集群了。
整合 Apache 与 Tomcat 集群 可以使用 mod_proxy_balancer也可以使用mod_jk.
我这里用了mod_jk。
1、下载 Windows 版 mod_jk.so ,这里写图片描述
解压该文件,可得到” mod_jk.so ”。将” mod_jk.so ”拷到 apache \modules 目录下 ,然后在 apache \conf 下新建 workers.properties,

worker.list=controller
#========Tomcat1========
worker.Tomcat3.port=7009 #ajp协议的端口,如果2个tomcat部署在同一个服务器中,那个ajp端口需要不同
worker.Tomcat3.host=localhost #tomcat的所在主机的ip,如果是本机,则写本机的ip即可
worker.Tomcat3.type=ajp13  #协议类型
worker.Tomcat3.lbfactor=1  #负载因子
#========Tomcat2========
worker.Tomcat2.port=9009
worker.Tomcat2.host=localhost
worker.Tomcat2.type=ajp13
worker.Tomcat2.lbfactor=1  #如果2个tomcat,该参数相同,表示等比例,如果想tomcat负载多一点,只要把这个参数改的大一点即可
#========controller========
worker.controller.type=lb
worker.controller.retries=3  #请求失败以后重试次数
worker.controller.balanced_workers=Tomcat2,Tomcat3  #controller控制的tomcat的名称,分别为tomcat2和tomcat3,由tomcat中的server.xml中设值
#如果 worker.controller.sticky_session 设为 true ,则同一用户的同一 session 始终和一个 Tomcat 节点交互
worker.controller.sticky_session=false

在 apache \conf 下新建 mod_jk.conf ,

LoadModule jk_module modules/mod_jk.so
#workers.properties 的位置 
JkWorkersFile conf/workers.properties
#Apache将 http://localhost/ 下的所有请求转发给 controller 处理 
JkMount /* controller

也可以写成JkMount /*.jsp controller
JkMount /*.do controller
当请求后缀我jsp或者是do的时候,apache把请求转发给tomcat来处理,前提是servlet后缀命名为*.do。

修改 httpd.conf ,打开 apache 2.2\conf\httpd.conf,在尾部添加一行 include conf/mod_jk.conf,添加mod_jk.conf文件。

配置完成,在浏览器中输入http://localhost/TestCluster/index.jsp
显示:
Server Info:
[localhost:80]2015-08-15 12:19:20
Session Info:
[Session Info] Session ID:05B70F5B73A2452755EF61D95D67C37F.Tomcat3
刷新一次:
Server Info:
[localhost:80]2015-08-15 12:20:27
Session Info:
[Session Info] Session ID:05B70F5B73A2452755EF61D95D67C37F.Tomcat2

两次请求,分别转发到了Tomcat1节点、Tomcat2节点,并且两个节点的Session一样 。

静态文件直接由apache响应,所需需要把部署的项目中的静态文件放在apache的安装目录下的htdocs文件夹下,偷懒的方法就是直接把tomcat的webapps中的项目拷贝一份放到htdocs中,所以htdocs的作用与tomcat的webapps类似

部署的时候经常会出现一些错误,当遇到错误的时候我经常需要查看日志文件,我经常查看的日志有apache的日志以及tomcat的日志

apache安装目录下的logs文件夹下就存放这apache的相关日志
access.log文件用于记录apache接收到请求以及响应状态的日志
error.log文件用于记录apache的运行错误
httpd.pid文件用于记录进程pid
mod_jk.log文件用于记录请求转发给tomcat的日志

tomcat的日志:
localhost_access_log.日期.txt文件用于记录tomcat接收到的请求以及响应的状态等,作用于apache的access.log类似
catalina.日期.txt文件用于记录tomcat启动时候控制台的一些信息以及服务端错误信息
localhost.日期.txt文件用于记录站点访问信息,Tomcat下内部代码丢出的日志,文件名localhost.日期.log(jsp页面内部错误的异常,org.apache.jasper.runtime.HttpJspBase.service类丢出的,日志信息就在该文件!)

官方文档中对于集群中session repliction的要求:
1).session中的属性必须全部为实现Serializable
2).tomcat的server.xml配置文件中的< Cluster>节点的注释去掉
3).就是用于用于检测当前的响应是否涉及Session数据的更新,如果是则启动Session拷贝操作,这个属性后面会有一个filter属性,filter即过滤不需要Session拷贝操作的内容
4).如果tomcat在同一个机器上的,那么确保tcpListenerPort端口的唯一性
5).web.xml中必须添加< distributable/>属性
6).如果使用mod_jk,那么需要在server.xml中的 < Engine/>节点中添加jvmRoute=“tomcat1”属性,事实证明在ajp端口那边添加也是可行的
7).确保所有的tomcat时钟同步,使用ntp服务器来达成
8).确保负载均衡器的sticky_session=false已经设置,即设置为非粘性

本博文参考了百度查询的很多文档博客,不过上述本人都有自己操作,知识都是共享的嘛~~
这样基本完成了整合,至于想深入理解其中原理,可以去研究tomcat源码以及一些参考书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值