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服务器中能看到各自的访问日志。