apache整合tomcat部署集羣

近日,因爲公司項目須要,因此學習了apache整合tomcat以及集羣的一些知識。html

  因此作下筆記往後回顧能夠用到。web

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

apache和tomcat的整合須要準備的一些軟件列表:tomcat

圖1服務器

說明:session

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

  用一下命令能夠查詢80端口被哪一個進程id佔用,netstat -aon|findstr "80" 負載均衡

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

  apache檢查錯誤方法:進入cmd 而後進入 Apache安裝目錄(具體爲你本身的安裝目錄)\bin> httpd.exe -w -n "Apache2" -k startjvm

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 --><br>    <!--若是多個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已經設置,即設置爲非粘性

相關文章
相關標籤/搜索