近日,由于公司項目需要,所以學習了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中的各個參數:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #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文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?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已經設置,即設置為非粘性
?
參考:
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
?
?
轉載博客,原博客地址:http://www.cnblogs.com/God-froest/p/apache_tomcat.html