Tomcat安裝、配置、優化及負載均衡詳解
一、常見JavaWeb伺服器
1、WebLogic:是BEA公司的產品、WebSphereAS:是IBM公司的產品、JBossAS:紅帽公司的產品,可以自行了解
2、Tomcat伺服器:Sun公司在推出的小型Servlet/JSP除錯工具的基礎上發展起來的一個優秀的Servlet容器,Tomcat本身完全用java語言編寫,所以tomcat的執行需要java的支援,所以要先安裝JDK,才能執行。
目前是Apache開源軟體組織的一個軟體專案,它的官網 :
ofollow,noindex" target="_blank">http://tomcat.apache.org
Tomcat得到了廣大開原始碼志願者的大力支援,且可以和目前大部分的主流Web伺服器(IIS、Apache伺服器)一起工作,它執行穩定、可靠且高效。已成為目前開發企業JavaWeb應用的最佳Servlet容器選擇之一。
二、Tomcat的目錄結構及常用配置
1、Tomcat的目錄層次結構
- bin:存放啟動和關閉Tomcat的指令碼檔案
- conf:存放Tomcat伺服器的各種配置檔案
- lib:存放tomcat伺服器支撐的jar包
- logs:存放Tomcat的日誌檔案
- temp:存放Tomcat執行時產生的臨時檔案
- webapps:web應用雖在目錄,即供外界訪問的web資源的存放目錄
- work:Tomcat的工作目錄
2、JavaWeb應用的組成結構
mail---------------------------Web應用所在目錄 |----html、jsp、css、js等檔案,根目錄下的檔案外界可以直接訪問 |----WEB-INF目錄 |---------classes目錄(java類) |---------lib目錄(java類執行所需的jar包) |---------web.xml(web應用的配置檔案) WEB-INF 這個目錄下的檔案外界無法直接訪問,由web伺服器負責呼叫
3、JavaWeb應用的釋出
開放式目錄方式:
打包war方式: 使用 Jar -cvf *.war .
4、Tomcat的組成結構
Tomcat本身由一系列可配置的元件構成,其中核心元件是Servlet容器元件,它是所有其他Tomcat元件的頂層容器。
每個元件都可以在Tomcat安裝目錄/conf/server.xml檔案中進行配置,每個Tomcat元件在server.xml檔案中對應一種配置元素。下面用XML的形式展示各種Tomcat元件之間的關係
<Server>代表整個Servlet容器元件,是最頂層元素,可以包含一個或多個<Service>元素 <Service>包含一個<Engine>元素以及一個或多個<Connector>元素,這些<Connector>共享一個<Engine> <Connector/>代表和客戶程式實際互動的元件,負責接收客戶請求,以及向客戶返回響應 <Engine>每個<Service>元素只能包含一個<Engine>元素,它處理在同一個<Service>中所有<Connector>接收到的客戶請求 <Host>在一個<Engine>中可以包含多個<Host>,它代表一個虛擬主機(即一個伺服器程式可以部署在多個有不同IP的伺服器主機上),它可以包含一個或多個應用 <Context>使用最頻繁的元素,代表了執行在虛擬主機上的單個web應用 </Host> </Engine> </Service> </Server>
5、Tomcat體系結構
6、虛擬目錄的對映方式
從Tomcat6開始,Tomcat支援自動對映,即tomcat伺服器會自動管理webapps目錄下的所有web應用,並把它對映成虛擬目錄,換句話說,只需把web應用放在webapps目錄下,不需要配置Context,外界可以直接訪問。
但是如果你不想講專案放在webapps下,而是放在其他地方,還是需要配置Context,比如我的tomcat在C盤,我的專案在D盤,則需要在Host下增加如下虛擬目錄對映語句。
<Contextpath="/myapp"docBase="D:/work/myapp"></Context>
7、Context元素配置
tomcat在載入一個web應用時,會一次按照以下五種方式查詢web應用中的元素,優先順序一次降低,直到找到為止
- 到Tomcat安裝目錄/conf/Context.xml檔案中查詢元素。
- 到Tomcat安裝錄/conf/[enginename]/[hostname]/context.xml.default檔案中查詢元素。[enginename]:表示的name屬性
- [hostname]:表示d的那麼屬性
- 到Tomcat安裝目錄/conf/[enginename]/[hostname]/[contextpath].xml檔案中查詢元素
- [contextpath]:表示單個Web應用的URL入口
- 到Web應用的META-INF/context.xml檔案中查詢元素
- 到Tomcat安裝目錄/conf/server.xml檔案中查詢元素。只適用於單個Web應用
8、將專案部署為Tomcat預設應用
即訪問 http://localhost:8080 時出來的是tomcat自帶的歡迎頁面,改為登入到自己的專案主頁。
方法一:
在Tomcat預設安裝後,tomcat的主目錄是webapps/root目錄,所以如果想改變tomcat的主目錄的話可以如下所做:
在/conf/server.xml檔案的之間加入程式碼
<Contextpath=""docBase="C:\tomcat7\webapps\myapp"reloadable="true"debug="0"></Context> <!-- docBase改為自己需要的專案路徑 如果建立了Apache和tomcat叢集,Apache server 的預設埠是80 ,IE訪問的方法只需輸入:http://localhost,就可以自動定位到xx工程下面去 -->
方法二:
將tomcat安裝目錄下的ROOT下的所有檔案刪除,換成自己專案的檔案,此法有點暴力。
方法三:
Tomcat5.0以下版本在C:/Tomcat/conf/Catalina/localhost目錄下會自動生成了一個ROOT.Xml,但是5.0以上版本不再生成此檔案。
所以可以新建個ROOT.xml,在裡面加入如下程式碼:
<?Xml version='1.0' encoding='utf-8'?> <ContextcrossContext="true"docBase="C:\tomcat7\webapps\myapp"path=""reloadable="true"> </Context> <!--但是我自己在7.0版本上測試好像未成功,大家可以自己試試-->
9、Context元素的屬性
path:指定訪問該Web應用的URL入口
docBase:指定Web應用的檔案路徑,可以寫絕對路徑,也可以寫相對於appBase屬性的相對路徑
className:指定實現Context元件的Java類的名字,這個類必須實現org.apache.catalina.Contex介面,該屬性預設值為org.apache.catalina.core.StandardContext(不建議大家改動)
reloadable:如果為true,Tomcat伺服器在執行狀態下回監視在WEB-INF/classes和WEB-INF/lib目錄下的class檔案的改動,以及監視Web應用的WEB-INF/web.xml檔案的改動,如果檢測到有更新,伺服器會自動更新載入web應用。
其預設值為false。在開發和除錯階段,將其改為true,一般像Eclipse等開發環境都會預設改為true。在正式釋出階段,應將其該為false,可以降低Tomcat的執行負荷,提高Tomcat的執行效能
在一般情況下,元素都會使用預設的標準Context元件,即className屬性採用預設值org.apache.catalina.core.StandardContext,它除了擁有上面介紹到的屬性外,還有自身專有的屬性:
- cachingAllowed:是否允許啟用靜態資源(HTML、圖片、聲音等)的快取。預設值為true。
- cacheMaxSize:設定靜態資源快取的最大值,單位為K。
- workDir:指定Web應用的工作目錄。
- uppackWAR:如果為true,會把war檔案展開為開放目錄後再執行。為false,直接執行war檔案。預設值為true。
10、web.xml檔案
該檔案必須放在/WEB-INF目錄下,但是從7.0版本開始,Tomcat可以不使用web.xml檔案,而是使用註解方式。
三、Tomcat的優化
1、記憶體使用配置
Tomcat是依賴於JVM的,所以Tomcat的使用記憶體配置實質上是JVM的記憶體配置。
在/bin目錄下的catalina.bat可以直接通過Tomcat設定JVM記憶體引數,windows下開啟catalina.bat檔案,在大概中間的位置,找到
set "JAVA_OPTS=%JAVA_OPT% -server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"
通過記憶體設定充分利用伺服器記憶體
- -server:模式啟動應用慢,但是極大程度提高執行效能
- -Xms2048m -Xmx2048m:設定的是堆記憶體
java8開始,PermSize被MetaspaceSize代替,MetaspaceSize共享heap,不會再有java.lang.OutOfMemoryError:PermGen space,可以不設定
- Headless=true:適用於Linux系統,與圖形操作有關,如生成驗證碼含義是當前的是無顯示器的伺服器,應用中如果獲取系統顯示有關的引數會丟擲異常,windows系統可不用設定
可通過jmap -heap process_id檢視設定是否成功
2、最大連線數配置(併發能力)
在/conf/server.xml裡進行配置
在屬性中將protocol屬性改為
"org.apache.coyote.http11.Http11NioProtocol",
IO/">NIO模型的效率更高
加入
maxThreads="500" //當前可以同時處理的最大使用者訪問數 minSpareThreads="100" //最小空閒執行緒連線數,用於優化執行緒池 maxSpareThreads="200" acceptCount="200" //當所有的執行緒以分配,仍然允許連線進來,但是出於等待狀態的使用者數。 //等待執行緒數+工作執行緒數=總的可最大連線數,如果超過此數, //新的連線將不會被接受,就會產生一個http錯誤 enableLookups="false" //是否允許DNS反查,如果為true,request.getRemoteHost會執行DNS查詢,反向解析ip對應域名或主機名, //當沒有這樣需要的時候,可以將這個功能關閉,在一定程度上提高了Tomcat伺服器的效能
四、負載均衡配置
負載均衡是提高應用負載量和容錯的有效手段,可以結合Nginxs與Tomcat實現,Nginx是一款效能優異的反向代理伺服器。
1、負載均衡配置實現
反向代理原理示意圖:
負載均衡示意圖:
負載均衡策略:
Nginx 提供輪詢(round robin)、使用者IP雜湊(client IP)和指定權重 3 種方式
2、負載均衡時Session的處理策略
Session是Tomcat伺服器上的記憶體空間,如果一個使用者發出多個請求,卻發到了多個tomcat伺服器中,那麼就會出現Session不同步的問題
解決方案1
將一個使用者的請求鎖定到某一臺伺服器上,簡單,但是缺乏容錯性,一旦某個伺服器發生故障,Session可能丟失,(但是伺服器發生故障是一個低概率事件,如果一個伺服器經常掛掉,要麼是硬體有問題,要麼是應用有問題)
可以使用使用者IP雜湊實現
解決方案2
Session複製策略,基於網路的廣播策略,一個節點Session變化,其他節點同步複製,具有容錯性,但節點多或複製量大時對網路負荷大,使網路效率低下,甚至阻塞
① 在/conf/server.xml檔案中開啟Session複製的選項,將註釋去掉,7.0預設值以配置好,需要接收器繫結內網(一般伺服器都有兩塊網絡卡)網絡卡地址,修改埠>。
② 在應用中指定應用是在分散式部署之下,在web.xml中新增選項
解決方案3
額外建立一個共享的空間用來存放Session,所有伺服器共享一個Session
memcached快取共享方案基本原理
粘性Session與非粘性Session方式:
需要一些工具jar包,官網有目錄和下載連線,在/conf/context.xml中進行配置,全域性有效。
3、叢集環境中應用程式碼應注意的問題
傳遞Session需要實體類序列化支援,實現可序列化介面,設定版本號。
獲取使用者IP地址方法的變化,獲取真實客戶端ip而不是Nginx代理地址。
動靜分離結構的預規劃。一般高併發的網站上,資源類的檔案,如js,css,圖片通常是由靜態伺服器處理,Nginx處理靜態檔案效率就非常高,而tomcat處理靜態檔案是它很大的一個弱勢,tomcat只負責動態請求的處理。
那麼編碼的時候就要考慮靜態資源最後可能要被拿出去,地址會有變化,所以在開發的時候應該規劃訪問地址,保持最大靈活性。