今天整了一下apache整合Tomcat 集群负载均衡配置,在网上看了好多篇文章,正确的太水,在这里我贴出我结合看了多遍文章的结果
1:Apache的安装:这是下载地址:http://download.csdn.net/download/wangbo54979/9560498 你们也可以去Apache的官网自行下载
2:Tomcat 这是下载地址: http://download.csdn.net/download/wangbo54979/9979752 我这是免安装版 解压直接用的
3:JK组件 这是下载地址: http://download.csdn.net/download/wangbo54979/9979757 这里是我已经改过名的mod_jk.so
你们也可以去官网下载,mod_jk-1.2.31-httpd-2.2.3.so,请下载合适的mod_jk版本,改名为mod_jk.so
4:JDK 安装环境变量配置就不说了
我本次测试的是2个Tomcat,分别是Tomcat1和Tomcat2
这里面 贴出 官网的下载地址 他这版本可能和我的有点出入:
1. Apache: apache 2.0.55 (由http://httpd.apache.org/进入下载)(点击下载apache 2.0.55)
2. Tomcat: Tomcat 5.5.25 (由http://tomcat.apache.org/进入下载)(点击下载Tomcat 5.5.25 zip版)
3. mod_jk: 在页面 http://tomcat.apache.org/ Download 标题下找到 Tomcat Connectors 链接进入( 点击下载mod_jk-apache-2.0.55.so)
Apache安装最好不要放在C盘: 这是我随意建的一个目录 D:\jqtest\apatch\Apache2.2\conf
把上面下载好的mod_jk.so 放入到D:\jqtest\apatch\Apache2.2\modules 目录下 注意找到Apache的modules 目录 把jk丢进去就不管了 .
然后打开conf下的 httpd.conf文件 :
需要注意的是:Listen 80 他有个这个监听端口,就是你的服务器支持哪个写哪个,但一般服务器都支持80端口所以就不用管,除非个别网络服务商把,你当前所在的区域80端口给屏蔽了,那你就得调换端口了
一直 拖拖到httpd.conf文件的最下面加入 :Include C:\java\work\mod_jk.conf 我这里就随便找了个位置 存放了 这个文件里面配置一些信息 如下:
LoadModule jk_module modules/mod_jk.so 刚刚说丢到Apache下面modules目录的JK组件 LoadModule rewrite_module modules/mod_rewrite.so 这个Apache modeles里面自带有 JkWorkersFile conf/workers.properties 这个文件需要自己 新建 放到Apache conf目录下的 JkLogLevel info
workers.properties文件:
#server worker.list = controller #========tomcat1======== worker.tomcat1.port=9030 worker.tomcat1.host=127.0.0.1 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor = 1 #========tomcat2======== worker.tomcat2.port=9031 worker.tomcat2.host=127.0.0.1 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 1 #========controller,负载均衡控制器======== ####负载均衡控制器,类似一个虚拟的worker,type必须是lb worker.controller.type=lb ####负载均衡集群中所有的tomcat都在这里了 worker.controller.balance_workers=tomcat1,tomcat2 #### 多个tomcat之间session的处理,使用不使用sticky的方式 worker.controller.sticky_session=false #第二个参数是如果掉线了则把当前SESSION复制到别的TOMCAT worker.controller.sticky_session_force=false worker.controller.sticky_session=1
好了work文件就这些配置 然后在回到 mod_jk.conf 开始配置 JK访问方式:
在文件原有的基础上,拖到最后面 添加代码如下:
<VirtualHost *:80> ServerAdmin xxxx@xxx.com ServerName localhost ServerAlias localhost DocumentRoot /opt/apache2.4/htdocs/test JkMount /*.do controller JkMount /*.jsp controller ErrorLog "logs/loadbalancer-error.log" CustomLog "logs/loadbalancer-access.log" common </VirtualHost>
tomcat1 的配置: 为了方便能看懂我就全部 贴出来 下面是server.xml文件
<?xml version='1.0' encoding='utf-8'?> <Server port="9010" shutdown="SHUTDOWN"> <!--2个Tomcat的这个端口不要一样--> <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.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <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"> <Connector port="9020" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> <!--这里面的9020就不说了 就跟8080一个意思 8433不能动--> <Connector port="9030" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/> <!-- 上面的9030 注意2个Tomcat不要一样--> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> <!--在正常的Tomcat里面你会发现其实这行是注释的--> <!--还是上面这行的解释,你会发现有一个跟他一样的代码 只是没有 jvmRoute 这里配置的要跟work文件里面对上 注释没有jvmRoute的开启有的--> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> <!--上面这行 正常情况下是注释的 在这里为了完成Tomcat的复制,把注释放开--> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> </Engine> </Service> </Server>还有 为了能让session复制 还需要配置一个文件context.xml 里面把 Context 加上dis...ble的 <Context distributable="true">
或者你也可以在web项目的web.xml文件里面加< distributable/>也行
tomcat2:配置跟1是一样的 只是端口不一样 ,我还是贴出来吧 但是没说明因为和上面一样
<?xml version='1.0' encoding='utf-8'?> <Server port="9011" 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.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <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"> <Connector port="9021" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> <Connector port="9031" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> </Engine> </Service> </Server>
还有2个文件里面都有一个 cs.jsp文件:根目录下
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.*" %> <html><head><title>Cluster App Test</title></head> <body> Server Info: <% out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%> <% out.println("<br> ID " + session.getId()+"<br>"); // 如果有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.println("<b>Session 列表</b><br>"); System.out.println("============================"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+"<br>"); System.out.println( name + " = " + value); } %> <form action="test2.jsp" method="POST"> 名称:<input type=text size=20 name="dataName"> <br> 值:<input type=text size=20 name="dataValue"> <br> <input type=submit> </form> </body> </html>
上面讲的是JK配置方式,如果操作无误。Apache是可以正常启动的,并且启动2个Tomcat是可以*分配的,因为下面我还要说明2种方式实现,最终的运行结果图 最后贴出:
下面说明ajp_proxy 方式配置:
去掉httpd.conf文件中下面内容的注释(删掉#号),开启下边的配置
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
注意:
除了mod_proxy.so,mod_proxy_balancer.so,mod_proxy_connect.so
如果是采用ajp_proxy,需要加载mod_proxy_ajp.so这个模块;
如果是采用http_proxy,需要加载mod_proxy_http.so这个模块;
在刚刚配置好的httpd.conf文件最下面加入:
ProxyRequests Off
<proxy balancer://controller> #controller 很明显是刚刚work文件里面配置的
BalancerMember ajp://127.0.0.1:9030 loadfactor=1 route=tomcat1 #这个Tomcat1 也是work文件配置的还有9030端口也是
BalancerMember ajp://127.0.0.1:9031 loadfactor=1 route=tomcat2
</proxy>
LoadModule jk_module modules/mod_jk.so LoadModule rewrite_module modules/mod_rewrite.so JkWorkersFile conf/workers.properties JkMount /*.do controller JkMount /*.jsp controller JkLogLevel info <VirtualHost *:80> ServerAdmin xxxx@xxx.com ServerName localhost ServerAlias localhost ProxyPass / balancer://controller/ stickysession=jsessionid nofailover=On ProxyPassReverse / balancer://controller/ #controller 是work文件里面配置的 ErrorLog "logs/loadbalancer-error.log" CustomLog "logs/loadbalancer-access.log" common </VirtualHost>
这就配置完了ajp的访问方式,重启Apache如果不报错,说明配置成功,如果有错请根据Apache目录logs目录的日志文件调错
下面来讲http的方式配置:
为了节约时间我这里就简单粗暴的 处理了。
删除httpd.conf下面 加的所有 代码,注意 上面说解开注释的那6行代码别删了
我这里 就直接不要 mod_jk.conf 文件 直接都写到 httpd.conf下面了
LoadModule jk_module modules/mod_jk.so LoadModule rewrite_module modules/mod_rewrite.so JkWorkersFile conf/workers.properties JkMount /*.do controller JkMount /*.jsp controller JkLogLevel info
ProxyRequests Off <proxy balancer://controller> BalancerMember http://127.0.0.1:9020 loadfactor=1 route=tomcat1 #需要注意的是这里以前是ajp切换成了http BalancerMember http://127.0.0.1:9021 loadfactor=1 route=tomcat2 #还有这个端口就不是对应的以前那个9030端口了 </proxy>
下面贴出运行结果: 我这里采用的ajp方式;
上面Tomcat配置中 改一下 :<Cluster className="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="5000" 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;"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
最后说一点:找到apatch里面conf下面的httpd.conf 文件下面的这段代码
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
改成这样,不然在配置静态资源的时候是访问不到的 提示你没权限访问
<Directory />
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
热情提醒一下: 不要开防火墙啊 .......