您的位置:首页 > 运维架构 > Tomcat

Windows下整合Apache2.2和Tomcat6.0 集群与负载均衡

2017-01-19 16:19 507 查看
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 集群工具安装

1. 

2. 

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配置

 

1.1. 

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. 

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",运行时须确保机器联网能访问到该地址,否则可能运行失败。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: