apache+tomcat分布式集群搭建

今天搭建apche+tomcat分布式集群,遇到很多问题,在网上找到的很多都不成功,然后和同事一起研究了一下,最终搭建成功了。做个笔记,以备自己以后参考。

1,下载apache。在下载Apache(2.4版)的时候,要下载完整版,不然会缺失很多东西。参考博文:http://jingyan.baidu.com/article/29697b912f6539ab20de3cf8.html

下载mod_jk.so,地址:http://apache.opencas.org/tomcat/tomcat-8/v8.0.33/bin/

地址里面有压缩包,下载一个与你对应的,在压缩包里面有mod_jk.so文件,拷贝到apache下文件夹modules下面。(版本注意,如果以后提示mod_jk.so错误的话,就要换一个mod_jk.so文件)。

打开conf/httpd.conf里面找到

Define SRVROOT "\apache"
ServerRoot "${SRVROOT}"

把SRVEOOT后面的路径改成你自己的Apache安装路径。

在httpd.conf同级目录下创建一个属性文件workers.properties,在文件中添加一下信息:

worker.list=jetty_a
worker.jetty_a.port=8009
worker.jetty_a.host=127.0.0.1
worker.jetty_a.type=ajp13
worker.jetty_a.lbfactor=2
 
worker.list=jetty_b
worker.jetty_b.port=8010
worker.jetty_b.host=127.0.0.1
worker.jetty_b.type=ajp13
worker.jetty_b.lbfactor=1
 
worker.list=jettybalancer
worker.jettybalancer.type=lb
worker.jettybalancer.balance_workers= jetty_a, jetty_b
worker.loadbalancer.sticky_seesion=false
worker.loadbalancer.sticky_session_force=false

上面信息是我们将要配置tomcat服务器的信息,sjp端口号分别是8009/8010,IP为本地所以需要修改,如果不是本地的两个服务器,那就不用改了。注意上面的参数,重点修改的是

worker.jetty_a.port
worker.jetty_a.host

上面tomcat的参数要和下面的参数项对应。

在conf/httpd.conf文件最下面添加一下信息。

LoadModule jk_module modules/mod_jk.so
<IfModule jk_module>
JkWorkersFile "${SRVROOT}/conf/workers.properties"
JkLogFile "${SRVROOT}/logs/mod_jk.log"
JkLogLevel warn
</IfModule>


<VirtualHost *:80>
<proxy balancer://cluster>
    BalancerMember ajp://127.0.0.1:8009 route=tomcat_a
    BalancerMember ajp://127.0.0.1:8010 route=tomcat_b
    ProxySet lbmethod=bytraffic
</proxy>
ServerAdmin ******@qq.com
#指定服务器管理员的E-MAIL地址,服务器自动将错误报告给该地址
ServerName  localhost
# web客户端搜索的主机名
ErrorLog    "${SRVROOT}/logs/app1_error.log"
CustomLog   "${SRVROOT}/logs/app1_access.log" common
ProxyPass /   balancer://cluster/ stickysession=JSESSIONID
# balancer: 复制会话的方式,包括JSESSIONID或PHPSESSIONID nofailover:on 表示会话在worker出错或停掉时会中断,当后端服务器不支持会话复制时设为on ;
# lbmethod:选择负载的调度算法,默认byrequests表示轮询调度(就是1:1),bytraffic表示加权重的调度,需加loadfactor指定权重值。
ProxyPassReverse / balancer://cluster/ stickysession=JSESSIONID
#此指令使Apache调整HTTP重定向应答中Location, Content-Location, URI头里的URL。这样可以避免在Apache作为反向代理使用时,后端服务器的HTTP重定向造成的绕过反向代理的问题。
#The ProxyRequests directive should usually be set off when using ProxyPass.
ProxyRequests Off
# 不允许作为正向代理
ProxyPreserveHost On
# 当启用时,此选项将把传入请求的"Host:"行传递给被代理的主机,而不是传递在ProxyPass中指定的主机名。
</VirtualHost>

2,下载tomcat。在tomcat使用上,没有太多的限制,能用就行。我的是8.0.33。

3,进入apache安装路径下的bin,打开cmd。

运行 httpd -k install 是安装apache的。在运行的时候,会出现很多问题,就是在apache默认的环境下,很多*.so的文件被注释了的。所以你在安装的时候会报错,错误信息会告诉你错误在哪,所以很好识别。现在安装的时候只需要把报错的*.so打开注释就行了。

报错的时候是一个一个报错的,第一次安装报错后,进行修改,然后在bin下运行cmd:httpd -k uninstall 卸载了apache,重新安装一次,一直到没有报错为止。

安装成功后,到服务里面去重新启动apache。我这还是报错了,但是这个错误会到日志里面去查看错误信息,其实还是开启一个*.so。

我这里总共打开了下面几个:

mod_proxy , mod_proxy_balancer , lbmethod_****_module , slotmem_shm_module , mod_proxy_ajp

这一部操作比较多,但是总结一句话,可以多开,不能少开,如果感觉不知道是哪个,那就多开几个。

4,apache配置完了,现在开始配置tomcat服务器。

因为我们有两个tomcat服务器,一般都知道端口不能冲突,所以端口要修改一下,把其中一个的端口修改了就行,另外一个可以不用改,我是对其中一个tomcat的所有端口都+1。反正只要配置的参数都一致就行了。具体如下3个地方修改:

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


  <Connector port="8088" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8444" />

  
 <Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />

修改完上面的端口后,还要配置集群信息。在tomcat里面被注释的Cluster标签下面添加如下信息:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
        <Manager className="org.apache.catalina.ha.session.DeltaManager"
                 expireSessionsOnShutdown="false"
                 notifyListenersOnReplication="true"/>
        <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"/>
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto" port="4000" autoBind="100"
                      selectorTimeout="5000" maxThreads="6"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
        </Channel>
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
        <!--<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>-->
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>

部署完上面的,基本上就可以了,服务器集群。然后我们在需要集群的项目中声明一下本项目集群就行。webapp/META-INF/context.xml添加如下信息:

<?xml version="1.0" encoding="UTF-8"?>
<Context distributable="true"
 className="org.apache.catalina.ha.context.ReplicatedContext"/>

到这,服务器和项目的配置基本完成了。我们现在把项目放到启动两个刚刚配置好的服务器下,然后访问项目。在项目中做一个简单的输出用来查看访问的哪个服务器,两个tomcat服务器中能看到各自的访问日志。