近日,因爲公司項目須要,因此學習了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已經設置,即設置爲非粘性