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文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<?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