今天整了一下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>
热情提醒一下: 不要开防火墙啊 .......