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