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

apache和tomcat的整合需要准备的一些软件列表:

图1

说明:

1.首先安装apache服务(httpd-2.2.25-win32-x86-no_ssl.msi),默认是80端口的,如果80端口被占用,则无法安装成功;

  用一下命令可以查询80端口被哪个进程id占用,netstat -aon|findstr "80"

  再用一下命令查询该进程id是代表哪个进程,tasklist|findstr "2016"

  apache检查错误方法:进入cmd 然后进入 Apache安装目录(具体为你自己的安装目录)\bin> httpd.exe -w -n "Apache2" -k start

2.打开apache的安装目录下面的modules文件夹,把图1中的mod_jk.so文件放入

3.在apache安装目录的conf文件夹下面配置mod_jk.conf文件,如果没有则新增一个,内容为:

图2

  图2中的第一行,指定mod_jk的配置文件,配置tomcat以及负载均衡

  图2中的第二行和第三行表示,当请求后缀我jsp或者是do的时候,apache把请求转发给tomcat来处理

3.配置完上面的配置文件以后,在apache的安装目录下的httpd.conf文件的末尾,把mod_jk.so模块以及mod_jk.conf配置文件加载进去

图3

4.配置apache的安装目录下的workers.properties文件,如果该文件不存在,自己新增一个即可

图4

介绍下图4中的各个参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#server
worker.list = controller      #控制器名称
#========tomcat1========
worker.tomcat1.port=8009      #ajp协议的端口,如果2个tomcat部署在同一个服务器中,那个ajp端口需要不同
worker.tomcat1.host=127.0.0.1 #tomcat的所在主机的ip,如果是本机,则写本机的ip即可
worker.tomcat1.type=ajp13     #协议类型
worker.tomcat1.lbfactor=1     #负载因子
 
#========tomcat2========
worker.tomcat2.port=9009
worker.tomcat2.host=127.0.0.1
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1    #如果2个tomcat,该参数相同,表示等比例,如果想tomcat负载多一点,只要把这个参数改的大一点即可,具体多少还是得看情况
  
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.retries=3  #请求失败以后重试次数
worker.controller.balance_workers=tomcat1,tomcat2   #controller控制的tomcat的名称,分别为tomcat1和tomcat2,由tomcat中的server.xml中设值
worker.controller.sticky_session=false    #回话是否有粘性,false表示无粘性,同一个回话的请求会到不同的tomcat中处理
worker.controller.sticky_session_force=false #当一个节点蹦了,如果设值为true,那么服务器返回500错误给客户端,如果设值为false,则转发给其他的tomcat,但是会丢失回话信息
#更详细的参数说明:http://tomcat.apache.org/connectors-doc/reference/workers.html

5.安装好apache服务以后再准备好tomcat(两个tomcat作为例子)

图5

tomcat需要配置server.xml文件

<?xml version='1.0' encoding='utf-8'?>

<!--如果多个tomcat部署在同一台服务器中,此处的关闭tomcat的端口需要更改,不能冲突-->

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

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

   <Listener className="org.apache.catalina.core.JasperListener" />

    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <GlobalNamingResources>

      <Resource name="UserDatabase" auth="Container"

                  type="org.apache.catalina.UserDatabase"

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

                factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

                pathname="conf/tomcat-users.xml" />

  </GlobalNamingResources>

    <Service name="Catalina">

      <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="4"/>

      <!--如果使用apache整合,那么此配置可以注释,因为apache是通过ajp协议来通信的,tomcat并不会直接暴露出来-->

      <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="300"/>

      <!-- Define an AJP 1.3 Connector on port 8009 --><br>   

    <!--如果多个tomcat部署在同一个服务器中,此处的ajp协议端口必须不一样,并且需要增加jvmRoute属性,

      该属性的值即为workers.properties中的tomcat的名称-->

      <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" jvmRoute="tomcat1"/>

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

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

          <Realm className="org.apache.catalina.realm.LockOutRealm">

            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/>

          </Realm>

          <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

                   prefix="localhost_access_log." suffix=".txt"

                   pattern="%h %l %u %t "%r" %s %b" />

          </Host>

    </Engine>

  </Service>

</Server>

  另外就是在web项目的web.xml中添加属性<distributable/>,用于告诉web容器,该项目属于分布式项目,不然无法session replication

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

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

图6

apache安装目录下的logs文件夹下就存放这apache的相关日志

access.log文件用于记录apache接收到请求以及响应状态的日志

error.log文件用于记录apache的运行错误

httpd.pid文件用于记录进程pid

mod_jk.log文件用于记录请求转发给tomcat的日志

图7

tomcat的日志:

localhost_access_log.日期.txt文件用于记录tomcat接收到的请求以及响应的状态等,作用于apache的access.log类似

catalina.日期.txt文件用于记录tomcat启动时候控制台的一些信息以及服务端错误信息

localhost.日期.txt文件用于记录站点访问信息,Tomcat下内部代码丢出的日志,文件名localhost.日期.log(jsp页面内部错误的异常,org.apache.jasper.runtime.HttpJspBase.service类丢出的,日志信息就在该文件!)

8.官方文档中对于集群中session repliction的要求:

图8

总共8点:

  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已经设置,即设置为非粘性

参考:

  1.https://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html

  2.http://www.cnblogs.com/dennisit/p/3370220.html

  3.http://502245466.blog.51cto.com/7559397/1280152

2. apache整合tomcat部署集群的更多相关文章

  1. apache整合tomcat部署集群

    近日,由于公司项目需要,所以学习了apache整合tomcat以及集群的一些知识. 所以做下笔记日后回顾可以用到. apache只有处理静态事物的能力, 而tomcat的强项就是处理动态的请求,所以a ...

  2. 结合Apache和Tomcat实现集群和负载均衡 JK 方式 2 (转)

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

  3. 结合Apache和Tomcat实现集群和负载均衡 JK 方式

    本文基本参考自 轻松实现Apache,Tomcat集群和负载均衡,经由实操经历记录而成,碰到些出入,以及个别地方依据个人的习惯,所以在一定程度上未能保持原文的完整性,还望原著者海涵. 因原文中有较多的 ...

  4. 结合Apache和Tomcat实现集群和负载均衡

    http://fableking.iteye.com/blog/360870 TomcatApacheJSP应用服务器Web  本文基本参考自 轻松实现Apache,Tomcat集群和负载均衡,经由实 ...

  5. apache与tomcat负载集群的3种方法

    花了两天时间学习apache与tomcat的集成方法,现在把学习成果记录下来. apache与tomcat负载集群集成方法有3种jk.jk_proxy.http_proxy 本次集成使用的软件版本: ...

  6. 用apache和tomcat搭建集群,实现负载均衡

    型的企业应用每天都需要承受巨大的访问量,在着巨大访问量的背后有数台服务器支撑着,如果一台服务器崩溃了,那么其他服务器可以使企业应用继续运行,用户对服务器的运作是透明化的,如何实现这种透明化呢?由如下问 ...

  7. apache和tomcat搭建集群

    最近在学习简单的apache服务器和两个tomcat一起搭建集群,这里简单记录一下 1.准备工作 ①搭建一个可以运行的web项目 用maven搭建springmvc项目 ,只要将这里面的web.xml ...

  8. 云服务器 nginx + tomcat 部署集群 配置

    nginx.conf #user nobody; worker_processes ; #error_log logs/error.log; #error_log logs/error.log not ...

  9. apache配置weblogic部署集群,多节点的项目和单节点项目并存 负载均衡

    开启模块如下: LoadModule weblogic_module modules/mod_wl_22.so LoadModule lbmethod_byrequests_module module ...

随机推荐

  1. Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering

    <Windows Azure Platform 系列文章目录> 在有些时候,我们需要通过VNet Peering,把两个虚拟网络通过内网互通互联.比如: 1.在订阅A里的Virtual N ...

  2. xsd操作

    1.xsd介绍 详见: http://blog.sina.com.cn/s/blog_ad0672d60102uy6w.html 2.生成xsd DataSet dataSet = new DataD ...

  3. 《亲测》nginx webscoket ssl conf配置示例

    非crt证书,用的pem,其中 http://localhost:5003 是你要转发到的站点网址 配置的就是 server { listen 80; server_name smarthome.yi ...

  4. DS哈希查找--线性探测再散列

    题目描述 定义哈希函数为H(key) = key%11.输入表长(大于.等于11),输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字. --程序要求-- 若使用C++只能include一个 ...

  5. MOngoDB为现有数据添加或删除某一字段

    var lst =db.getCollection('config').find({}); while(lst.hasNext()) { var site=lst.next(); db.config. ...

  6. python 数组 变成 字典的方法

    1.现在有两个列表,list1 = ['key1','key2','key3']和list2 = ['1','2','3'],把他们转为这样的字典:{'key1':'1','key2':'2','ke ...

  7. 廖雪峰Java3异常处理-1错误处理-3抛出异常

    1.异常的传播 当某个方法抛出异常时: 如果当前方法没有捕获,异常就被抛到上层调用方法 直到遇到某个try...catch被捕获 使用printStackTrace()打印处方法的调用栈 import ...

  8. convert 批量文件的格式转换

    1.将 a.gif 转为 png 格式 convert a.gif a.png 请注意,convert 命令的基本格式为 convert 源文件 [参数] 目标文件 在上面的命令中,源文件是 a.gi ...

  9. 通过注解实现一个简易的Spring mvc框架

    1.首先我们来搭建架构,就建一个普通的javaweb项目就OK了,具体目录如下: 对于小白来说可以细看后面web.xml的配置,对javaweb有点研究可以忽略而过后面的web.xml配置. 2.先上 ...

  10. Maven Project pom.xml属性解析

    pom.xml文件: groupId 定义了项目属于哪个组,根据自己的情况命名,比如谷歌公司的angular项目,就取名为 com.google.angular artifactId  定义了当前Ma ...