Windows下整合Apache2.2和Tomcat6.0
集群与负载均衡
1. 介绍
Apache2.2+Tomcat有两种方式集群配置:
第一种:proxy代理与反向代理方式
第二种:jk连接器方式
2. 环境
平台:Windows Server 2008 R2 (64 位),4GRAM
软件:Jdk1.7,Apache2.2.19,Tomcat6.0.29
机器和网络配置
操作系统 | 网络配置 | 主机名 | 角色 | 备注 |
Win-Server2008R2(64) | IP: 99.1.14.203 PORT:8888 | pianoweb1sz0 | Apache Server | 管理/代理服务器 |
Win-Server2008R2(64) | IP: 99.1.14.203 PORT:8081 | pianoweb1sz0 | clustertomcat6_1 | Web服务器 |
Win-Server2008R2(64) | IP: 99.1.15.204 PORT:8081 | pianoweb2sz0 | clustertomcat6_1 | Web服务器 |
表1
【注】:
1. 两台服务器网络互通,可相互访问;
2. Apache只部署在其中一台服务器(pianoweb1sz0),且其默认端口改为8888 (httpd.conf文件内Listen 80的80端口修改为8888);
3. 当前只在每台机器部署一个工程实例,即一个tomcat;如果同一台部署多个实例,则需要注意其端口不可相同;
集群部署图示
图1
3. 配置集群
3.1 集群工具安装
Apache安装
安装步骤不细说。
建议安装路径以:盘符:/Apache
l 设置系统信息,三条信息均可任意填写,无效的也行。
成功完成安装后,桌面右下角状态栏会出现下面绿色图标,表示Apache服务已经开始运行。并且通过它可进行服务控制(启动/停止/重启)。
浏览器地址栏输入“http://127.0.0.1”,看到如下页面,表示Apache服务器已安装成功。
Tomcat安装
版本apache-tomcat-6.0.29.tar.gz,解压后即可使用。
分别解压到99.1.14.203、99.1.15.204机器,并命名如下:
机器 | 集群命名 |
99.1.14.203 | clustertomcat6_1 |
clustertomcat6_2 | |
99.1.15.204 | clustertomcat6_3 |
clustertomcat6_4 |
表2
3.2方案配置
3.2.1 proxy代理与反向代理方式
1. Apache配置
httpd.conf配置
修改APACHE的配置文件,安装目录/ Apache2.2/conf/httpd.conf:
需要修改几处:
1. 把下面几行去掉注释,即启用响应功能;
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
2. 修改目录访问权限;
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Denyfrom all
</Directory>
修改成
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allowfrom all
</Directory>
3. 增加index.jsp
找到<IfModule dir_module></IfModule>,为其加上index.jsp,
修改成:
<IfModule dir_module>
DirectoryIndex index.htmlindex.jsp
</IfModule>
4. 启用映射;
找到#Include conf/extra/httpd-vhosts.conf把注释去掉;
修改成:Include conf/extra/httpd-vhosts.conf
5.
<proxy balancer://cluster>
BalancerMember ajp:// 99.1.14.203:8011 loadfactor=1 route=clustertomcat6_1
#BalancerMember ajp:// 99.1.14.203:8012 loadfactor=1 route=clustertomcat6_2
#(如果每台部署两个实例,可把注释去掉)
#BalancerMember ajp:// 99.1.15.204:8012 loadfactor=1 route=clustertomcat6_2
BalancerMember ajp:// 99.1.15.204:8011 loadfactor=1 route=clustertomcat6_1
</proxy>
BalancerMember成员将在后面介绍。
httpd-vhosts.conf设置
安装目录\Apache2.2\conf\extra\httpd-vhosts.conf)原有的<VirtualHost*:80>给注释掉,在文件最下面加入
<VirtualHost *:8888>
ServerAdmin webmaster@ neu.com
ServerName neu.com
ServerAlias www.neu.com
ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionidnofailover=On
ProxyPassReverse / balancer://cluster/
</VirtualHost>
2. 配置Tomcat
对Tomcat的server.xml进行配置。
a. 配置Server port
一台机器上跑多个 tomcat ,需要修改不同 tomcat 的Server port,避免出现端口被占用的情况。
在tomcat-6.1\conf\server.xml文件中找到<Server port="8005" shutdown="SHUTDOWN">,修改成:<Server port="8006" shutdown="SHUTDOWN">,并将其余3个Tomcat的Server port分别修改成8007,8008,8009。
b. 配置Connector port
在tomcat-6.1\conf\server.xml文件中找到
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />
修改成:
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />
并将其余3个Tomcat的port分别修改成8082,8083,8084。
继续往下找到
<Connector port="8009" protocol="AJP/1.3"redirectPort="8443" />,修改成:
<Connector port="8011" protocol="AJP/1.3"redirectPort="8443" />,并将其余3个Tomcat的port分别修改成8012,8013,8014。
这里是apache和tomcat链接的关键,前台apache就是通过AJP协议与tomcat进行通信的,以完成负载均衡,上面的红色部分(port="8010")就是连接的端口了。
回顾一下httpd.conf配置中的
<proxy balancer://cluster>
BalancerMember ajp://172.20.50.133:8011loadfactor=1 route=tomcat1
BalancerMember ajp://172.20.50.133:8012loadfactor=1 route=tomcat2
BalancerMember ajp://172.20.50.183:8013loadfactor=1 route=tomcat3
BalancerMember ajp://172.20.50.183:8014loadfactor=1 route=tomcat4
</proxy>
Tomcat中的端口要和“ajp://172.20.50.133:XXXX”后面端口一致。
c. 配置Engine
在tomcat-6.1\conf\server.xml文件中找到
<Engine name="Catalina" defaultHost="localhost">,
修改成:
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">
并将其余3个Tomcat的jvmRoute分别修改成:
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat2">
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat3">
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat4">
回顾一下httpd.conf配置中的
<proxy balancer://cluster>
BalancerMember ajp://172.20.50.133:8011 loadfactor=1 route=tomcat1
BalancerMember ajp://172.20.50.133:8012 loadfactor=1 route=tomcat2
BalancerMember ajp://172.20.50.183:8013 loadfactor=1 route=tomcat3
BalancerMember ajp://172.20.50.183:8014 loadfactor=1 route=tomcat4
</proxy>
Tomcat中的jvmRoute="tomcatx"要和“route=tomcatx”中的命名一致。
d. 配置Cluster
在tomcat-6.1\conf\server.xml文件中找到被注释掉的<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>,在注释行的下面添加:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5001"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
其余3个Tomcat都要做相同的配置,注意每个Tomcat之间的差别是<Receiver>标签下面的port值不一样,这里是5001,其余3个Tomcat中分别是5002,5003,5004。
3.2.2 jk连接器方式
jk方式配置需要依赖于mod_jk.so库。此方案使用mod_jk-1.2.31-httpd-2.2.3.so,并将其放在Apache安装目录的modules目录下。
1.Apache配置
httpd.conf配置
为了避免直接对httpd.conf进行过多的修改,本方案采用增加mod_jk.conf配置文件,并在httpd.conf文件内引入。mod_jk.conf与httpd.conf文件在同一目录。
在httpd.conf文件最后加入:
Include conf/mod_jk.conf
mod_jk.conf文件内容:
#引入mod_jk.so包库
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
#引入集群实例配置文件
JkWorkersFile conf/workers.properties
#引入请求过滤配置,即可以指定哪些请求被controller(均衡器)处理
JkWorkersFile conf/uriworkermap.properties
Workers.properties文件内容:
#server
worker.list=controller,status
#========tomcat1========
worker.clustertomcat6_1.port=7011
worker.clustertomcat6_1.host=99.1.67.30
worker.clustertomcat6_1.type=ajp13
worker.clustertomcat6_1.lbfactor=1
#========tomcat2========
worker.clustertomcat6_2.port=7012
worker.clustertomcat6_2.host=99.1.67.30
worker.clustertomcat6_2.type=ajp13
worker.clustertomcat6_2.lbfactor=1
#========tomcat3========
worker.clustertomcat6_3.port=7013
worker.clustertomcat6_3.host=99.1.67.149
worker.clustertomcat6_3.type=ajp13
worker.clustertomcat6_3.lbfactor=1
#========controller负载均衡控制器========
worker.controller.type=lb
worker.controller.balance_workers=clustertomcat6_1,clustertomcat6_2,clustertomcat6_3
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
worker.controller.sticky_session=1
worker.status.type=status
uriworkermap.properties文件内容:
暂不指定,因此所有请求都会被处理。
2. Tomcat配置
配置同proxy代理方式的tomcat一致,在此不累赘。
4. 集群负载均衡和Session共享验证
3.1.1.Session共享的条件
1. 所有session中的对象可以序列化,实现 java.io.Serializable接口。
2. 确保你部署文件中的web.xml有<distributable/>元素(其父元素为</web-app>),或者设置你的<Context distributable="true" />。本文采用的是在web.xml中添加<distributable/>元素。当使用多台机器时,要保证不同机器时间的同步。
3. 确保你的loadbalancer是sticky session 模式。
sessionId 一致则说明已经实现session共享。
重要说明:
(1).如果项目要发布到集群上,那么与会话有关的类需要实现java.io.Serializable序列化接口。
(2).集群中Tomcat间用组播方式进行通信,如果机器上有多个网卡则可能导致组播失败,解决的办法是<Cluster>元素的<Membership>元素配置bind属性,它用于明确知道组播地址:
<MembershipclassName="org.apache.catalina.tribes.membership.McastService" bind="127.0.0.1".../>
(3).如果集群较小,可以采用DeltaManager会话管理器,如果多的话建议使用BackupManager
(4).<Membership>的address设为"228.0.0.4",运行时须确保机器联网能访问到该地址,否则可能运行失败。