apache2.2 + tomcat7 集羣配置記錄

一直說做一下這個集羣練習的,今天終於有時間了,就練習了一下,網上摘錄了很多朋友的技術成果。完成了自己的練習。

官網上下載的apache版本爲:httpd-2.2.22-win32-x86-no_ssl.msi

tomcat的版本是:apache-tomcat-7.0.30

在自己的電腦上:window xp上做的練習

安裝apache,這個就不說了。一路next就可以。

小弟做了三個tomcat,由於硬件資源有限,所以三個tomcat都放在了本機。分別取名:tomcat7_a、tomcat7_b、tomcat7_c。放在D、E、F盤上。

都裝好後,就開始配置,我這裏先配置的是apache,採用的不是JK,是mod_proxy_blancer方式,這種方式簡單一些。

1、打開apache安裝目錄:conf下面的httpd.conf,如果怕配置錯誤,可以先備份一把。

在httpd.conf裏面,把註釋着的這幾個模塊打開,讓apache加載這些模塊:

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

在httpd.conf的最後加上虛擬主機和代理端口配置:

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName localhost
    ServerAlias localhost
    #小心,有些地方要有空格,要不然會出錯哈哈。
    ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
    ProxyPassReverse / balancer://cluster/
    #ErrorLog "logs/error.log"
    #CustomLog "logs/access.log" common
</VirtualHost>

#The ProxyRequests directive should usually be set off when using ProxyPass.

ProxyRequests Off

<proxy balancer://cluster>
    #這些參數我們可以自己設定,ajp要和tomcat對應,我這裏做了三個tomcat
    BalancerMember ajp://localhost:8009 loadfactor=1 route=tomcat7_a  smax=5 max=20 ttl=120 retry=300 timeout=15
    BalancerMember ajp://localhost:9009 loadfactor=1 route=tomcat7_b  smax=5 max=20 ttl=120 retry=300 timeout=15
    BalancerMember ajp://localhost:7009 loadfactor=1 route=tomcat7_c  smax=5 max=20 ttl=120 retry=300 timeout=15
    # status=+H爲配置熱備,當所有機器都over時,纔會請求該機器
    #BalancerMember http://192.168.1.218:8009 status=+H
    ProxySet lbmethod=bytraffic
</proxy>

這樣apache就配置完成了,下面是tomcat。


2、tomcat7_a的配置,只需要配置conf/server.xml,如果要加連接池,其它,再進行配置。

tomcat7_a默認所有端口,8080的訪問端口,8009的ajp代理端口,我們都默認,所以只需要配置session複製的地方:

在server.xml的Engine節點裏面,添加jvmRoute="tomcat7_a",取個名字嘛。

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_a">
在Engine節點裏面,再添加(注意是添加,以前的host這些節點,我們繼續保留)以下代碼:具體意思,我們可以查看API:

<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"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      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"/>

          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>

					<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
           <!-- <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.JvmRouteSessionIDBinderListener"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

        </Cluster>

3、下面是tomcat7_b的配置:

端口已經給了a tomcat,所以我們要修改端口:總共有三個地方需要以a tomcat不同:

<Server port="9005" shutdown="SHUTDOWN"><!--默認是8005-->

<Connector port="9080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /> <!--默認是8080-->

<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" /> <!--默認是8009-->

接下來的配置和tomcat7_a一樣:

在server.xml的Engine節點裏面,添加jvmRoute="tomcat7_b",取個名字嘛。

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_b">
在Engine節點裏面,再添加(注意是添加,以前的host這些節點,我們繼續保留)以下代碼:具體意思,我們可以查看API:

<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"/>
<!--這裏值得注意:port端口和tomcat7_a不一樣,Reciver的port屬性,默認爲5000,tomcat識別的範圍爲4000-4100-->
 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4001"
                      autoBind="100"
                      selectorTimeout="5000"
                      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"/>

          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>

					<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
           <!-- <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.JvmRouteSessionIDBinderListener"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

        </Cluster>

tomcat7_b也配置好了。

4、下面是tomcat7_c的配置。基本同b的配置雷同:

端口已經給了a tomcat,所以我們要修改端口:總共有三個地方需要以a和b tomcat不同:

<Server port="7005" shutdown="SHUTDOWN"><!--默認是8005-->
<Connector port="7080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /> <!--默認是8080-->

<Connector port="7009" protocol="AJP/1.3" redirectPort="8443" /> <!--默認是8009-->

接下來的配置和tomcat7_a一樣:

在server.xml的Engine節點裏面,添加jvmRoute="tomcat7_c",取個名字嘛。

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_c">
在Engine節點裏面,再添加(注意是添加,以前的host這些節點,我們繼續保留)以下代碼:具體意思,我們可以查看API:

<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"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4002"
                      autoBind="100"
                      selectorTimeout="5000"
                      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"/>

          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>

					<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
            <!--<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.JvmRouteSessionIDBinderListener"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

        </Cluster>

好了,配置完成。做一個簡單的工程,放在這三個tomcat的webapp下面。我想是不是虛擬目錄,可以一個工程都行。

工程很簡單,就是一個web工程。index.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>
<br/>
<!--tomcat7_a就都寫a  tomcat7_b工程裏都寫b   tomcat7_c工程裏都寫c--> 
<b>負載均衡測試:此爲:Tomcat7_a上的文件,aaaaaaaaaaaaaaaaaa </b>
</body>
</html>

輸入地址:http://localhost/testTomcat/index.jsp

會發現三個tomcat都在正常工作,如果停掉其中一個,另兩個在工作。這樣就達到了負載均衡,而且session也可以進行復制。

apache + tomcat的集羣就成功部署了。

以上的配置我分別在tomcat a b c中放了三個工程,如果要使用一個工程,就配置虛擬目錄,當然這需要是本機的tomcat,配置虛擬目錄,就在server.xml中的host標籤里加上這句話:path需要加 / ,docBase,需要把目錄指向webroot下面。reloadable=true的話,classes被修改,會自動 重啓tomcat,我這裏設置爲false

<Context path="/doTomcat" docBase="D:\webapp\doTomcat" reloadable="false" />

注意的地方有兩點:

1、很多網友說,我們的工程web.xml裏面要加上這句

  <display-name>Welcome to Test Tomcat7 Cluster</display-name>  
      <description>Welcome to Test Tomcat7 Cluster</description>
  關鍵的是在工程web.xml中加上這句:意思是讓該工程的會話可複製,這樣才能在多個tomcat中切換。<distributable/>

原因是讓這個工程,要告訴servlet/JSP容器,編寫的應用將在分佈式Web容器中部署。我們還是加上吧,試了一下,貌似不加,也沒有出錯樣。

2、Tomcat7 a b c啓動的時候要報錯:嚴重: FarmWarDeployer can only work as host cluster subelement

則將以下部分註釋掉:
<!--
 <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"   
  tempDir="/tmp/war-temp/"   
  deployDir="/tmp/war-deploy/"   
  watchDir="/tmp/war-listen/"   
  watchEnabled="false"/>   
-->

發佈了40 篇原創文章 · 獲贊 26 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章