近日,由於公司項目需要,所以學習了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