apache整合tomcat部署集群


  近日,由於公司項目需要,所以學習了apache整合tomcat以及集群的一些知識。

  所以做下筆記日后回顧可以用到。

  apache只有處理靜態事物的能力, 而tomcat的強項就是處理動態的請求,所以apache和tomcat整合相互取長補短,由apache作為入口,如果是請求靜態頁面或者是靜態文件,由apache直接提供,如果是請求動態頁面,則讓apache分發到tomcat,由tomcat處理以后再響應給客戶端。

apache和tomcat的整合需要准備的一些軟件列表:

圖1

說明:

1.首先安裝apache服務(httpd-2.2.25-win32-x86-no_ssl.msi),默認是80端口的,如果80端口被占用,則無法安裝成功;

  用一下命令可以查詢80端口被哪個進程id占用,netstat -aon|findstr "80" 

  再用一下命令查詢該進程id是代表哪個進程,tasklist|findstr "2016"

  apache檢查錯誤方法:進入cmd 然后進入 Apache安裝目錄(具體為你自己的安裝目錄)\bin> httpd.exe -w -n "Apache2" -k start

2.打開apache的安裝目錄下面的modules文件夾,把圖1中的mod_jk.so文件放入

3.在apache安裝目錄的conf文件夾下面配置mod_jk.conf文件,如果沒有則新增一個,內容為:

圖2

  圖2中的第一行,指定mod_jk的配置文件,配置tomcat以及負載均衡

  圖2中的第二行和第三行表示,當請求后綴我jsp或者是do的時候,apache把請求轉發給tomcat來處理

3.配置完上面的配置文件以后,在apache的安裝目錄下的httpd.conf文件的末尾,把mod_jk.so模塊以及mod_jk.conf配置文件加載進去

圖3

4.配置apache的安裝目錄下的workers.properties文件,如果該文件不存在,自己新增一個即可

圖4

介紹下圖4中的各個參數:

#server
worker.list = controller      #控制器名稱
#========tomcat1========
worker.tomcat1.port=8009      #ajp協議的端口,如果2個tomcat部署在同一個服務器中,那個ajp端口需要不同
worker.tomcat1.host=127.0.0.1 #tomcat的所在主機的ip,如果是本機,則寫本機的ip即可
worker.tomcat1.type=ajp13     #協議類型
worker.tomcat1.lbfactor=1     #負載因子

#========tomcat2========
worker.tomcat2.port=9009
worker.tomcat2.host=127.0.0.1
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1    #如果2個tomcat,該參數相同,表示等比例,如果想tomcat負載多一點,只要把這個參數改的大一點即可,具體多少還是得看情況
 
#========controller,負載均衡控制器========
worker.controller.type=lb
worker.controller.retries=3  #請求失敗以后重試次數
worker.controller.balance_workers=tomcat1,tomcat2   #controller控制的tomcat的名稱,分別為tomcat1和tomcat2,由tomcat中的server.xml中設值
worker.controller.sticky_session=false    #回話是否有粘性,false表示無粘性,同一個回話的請求會到不同的tomcat中處理
worker.controller.sticky_session_force=false #當一個節點蹦了,如果設值為true,那么服務器返回500錯誤給客戶端,如果設值為false,則轉發給其他的tomcat,但是會丟失回話信息
#更詳細的參數說明:http://tomcat.apache.org/connectors-doc/reference/workers.html

5.安裝好apache服務以后再准備好tomcat(兩個tomcat作為例子)

圖5

tomcat需要配置server.xml文件

<?xml version='1.0' encoding='utf-8'?>
<!--如果多個tomcat部署在同一台服務器中,此處的關閉tomcat的端口需要更改,不能沖突-->
<Server port="8005" 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.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <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">
    
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="300" minSpareThreads="4"/>
    <!--如果使用apache整合,那么此配置可以注釋,因為apache是通過ajp協議來通信的,tomcat並不會直接暴露出來-->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" maxThreads="300"/>
   
     <!-- Define an AJP 1.3 Connector on port 8009 -->
<!--如果多個tomcat部署在同一個服務器中,此處的ajp協議端口必須不一樣,並且需要增加jvmRoute屬性,該屬性的值即為workers.properties中的tomcat的名稱--> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" jvmRoute="tomcat1"/> <Engine name="Catalina" defaultHost="localhost"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>

  另外就是在web項目的web.xml中添加屬性<distributable/>,用於告訴web容器,該項目屬於分布式項目,不然無法session replication

6. 靜態文件直接由apache響應,所需需要把部署的項目中的靜態文件放在apache的安裝目錄下的htdocs文件夾下,偷懶的方法就是直接把tomcat的webapps中的項目拷貝一份放到htdocs中,所以htdocs的作用與tomcat的webapps類似

7.部署的時候經常會出現一些錯誤,當遇到錯誤的時候我經常需要查看日志文件,我經常查看的日志有apache的日志以及tomcat的日志

圖6

apache安裝目錄下的logs文件夾下就存放這apache的相關日志

access.log文件用於記錄apache接收到請求以及響應狀態的日志

error.log文件用於記錄apache的運行錯誤

httpd.pid文件用於記錄進程pid

mod_jk.log文件用於記錄請求轉發給tomcat的日志

圖7

tomcat的日志:

localhost_access_log.日期.txt文件用於記錄tomcat接收到的請求以及響應的狀態等,作用於apache的access.log類似

catalina.日期.txt文件用於記錄tomcat啟動時候控制台的一些信息以及服務端錯誤信息

localhost.日期.txt文件用於記錄站點訪問信息,Tomcat下內部代碼丟出的日志,文件名localhost.日期.log(jsp頁面內部錯誤的異常,org.apache.jasper.runtime.HttpJspBase.service類丟出的,日志信息就在該文件!)

8.官方文檔中對於集群中session repliction的要求:

圖8

總共8點:

  1).session中的屬性必須全部為實現Serializable

  2).tomcat的server.xml配置文件中的<Cluster>節點的注釋去掉

  3).就是用於用於檢測當前的響應是否涉及Session數據的更新,如果是則啟動Session拷貝操作,這個屬性后面會有一個filter屬性,filter即過濾不需要Session拷貝操作的內容

  4).如果tomcat在同一個機器上的,那么確保tcpListenerPort端口的唯一性

  5).web.xml中必須添加<distributable/>屬性

  6).如果使用mod_jk,那么需要在server.xml中的<Engine/>節點中添加jvmRoute=“tomcat1”屬性,事實證明在ajp端口那邊添加也是可行的

  7).確保所有的tomcat時鍾同步,使用ntp服務器來達成

  8).確保負載均衡器的sticky_session=false已經設置,即設置為非粘性

 

參考:

  1.https://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html

  2.http://www.cnblogs.com/dennisit/p/3370220.html

  3.http://502245466.blog.51cto.com/7559397/1280152

 

 


免責聲明!

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



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