apache整合Tomcat 集群负载均衡配置

时间:2022-10-22 07:26:42

今天整了一下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> 


这里讲的是ajp的配置方式,所以需要删除mod_jk.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

<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方式;

apache整合Tomcat 集群负载均衡配置

apache整合Tomcat 集群负载均衡配置

apache整合Tomcat 集群负载均衡配置

apache整合Tomcat 集群负载均衡配置

上面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>

热情提醒一下:  不要开防火墙啊 .......