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服務器中能看到各自的訪問日志。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM