Tomcat安裝、配置、優化及負載均衡詳解
http://www.javashuo.com/article/p-tpsevaku-bb.html
1、常見JavaWeb服務器css
一、WebLogic:是BEA公司的產品、WebSphereAS:是IBM公司的產品、JBossAS:紅帽公司的產品,能夠自行了解 二、Tomcat服務器: Sun公司在推出的小型Servlet/JSP調試工具的基礎上發展起來的一個優秀的Servlet容器,Tomcat自己徹底用java語言編寫,因此tomcat的運行須要java的支持,因此要先安裝JDK,才能運行。目前是Apache開源軟件組織的一個軟件項目,它的官網 http://tomcat.apache.org。獲得了廣大開源代碼志願者的大力支持,且能夠和目前大部分的主流Web服務器(IIS、Apache服務器)一塊兒工做,它運行穩定、可靠且高效。已成爲目前開發企業JavaWeb應用的最佳Servlet容器選擇之一。目前最新版本8.0
2、Tomcat的目錄結構及經常使用配置
一、Tomcat的目錄層次結構
bin: 存放啓動和關閉Tomcat的腳本文件
conf: 存放Tomcat服務器的各類配置文件
lib: 存放tomcat服務器支撐的jar包
logs: 存放Tomcat的日誌文件
temp: 存放Tomcat運行時產生的臨時文件
webapps:web應用雖在目錄,即供外界訪問的web資源的存放目錄
work: Tomcat的工做目錄
二、JavaWeb應用的組成結構
mail---------------------------Web應用所在目錄
|----html、jsp、css、js等文件,根目錄下的文件外界能夠直接訪問
|----WEB-INF目錄
|---------classes目錄(java類)
|---------lib目錄(java類運行所需的jar包)
|---------web.xml(web應用的配置文件)
WEB-INF 這個目錄下的文件外界沒法直接訪問,由web服務器負責調用
三、JavaWeb應用的發佈
開放式目錄方式:
打包war方式: 使用 Jar -cvf *.war .
四、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>
複製代碼
五、Tomcat體系結構html
六、虛擬目錄的映射方式 從Tomcat6開始,Tomcat支持自動映射,即tomcat服務器會自動管理webapps目錄下的全部web應用,並把它映射成虛擬目錄,換句話說,只需把web應用放在webapps目錄下,不須要配置Context,外界能夠直接訪問 可是若是你不想講項目放在webapps下,而是放在其餘地方,仍是須要配置Context,好比個人tomcat在C盤,個人項目在D盤,則須要在Host下增長以下虛擬目錄映射語句
<Contextpath="/myapp"docBase="D:/work/myapp"></Context>
七、Context元素配置java
tomcat在加載一個web應用時,會一次按照如下五種方式查找web應用中的<Context>元素,優先級一次下降,直到找到爲止 1):到Tomcat安裝目錄/conf/Context.xml文件中查找<Context>元素。 2):到Tomcat安裝目錄/conf/[enginename]/[hostname]/context.xml.default文件中查找<Context>元素。 [enginename]:表示<Engine>的name屬性 [hostname]:表示<Host>d的那麼屬性 3):到Tomcat安裝目錄/conf/[enginename]/[hostname]/[contextpath].xml文件中查找<Context>元素 [contextpath]:表示單個Web應用的URL入口 4):到Web應用的META-INF/context.xml文件中查找<Context>元素 5):到Tomcat安裝目錄/conf/server.xml文件中查找<Context>元素。只適用於單個Web應用 八、將項目部署爲Tomcat默認應用 即訪問 http://localhost:8080 時出來的是tomcat自帶的歡迎頁面,改成登陸到本身的項目主頁 方法一: 在Tomcat默認安裝後,tomcat的主目錄是webapps/root目錄,因此若是想改變tomcat的主目錄的話能夠以下所作: 在/conf/server.xml文件的<Host></Host>之間加入代碼
<Contextpath=""docBase="C:\tomcat7\webapps\myapp"reloadable="true"debug="0"></Context>
<!--
docBase改成本身須要的項目路徑
若是創建了Apache和tomcat集羣,Apache server 的默認端口是80 ,IE訪問的方法只需輸入:http://localhost,就能夠自動定位到xx工程下面去
-->
方法二:web
將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版本上測試好像未成功,你們能夠本身試試-->
九、Context元素的屬性apache
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>元素都會使用默認的標準Context組件,即className屬性採用默認值org.apache.catalina.core.StandardContext,它除了擁有上面介紹到的屬性外,還有自身專有的屬性: cachingAllowed:是否容許啓用靜態資源(HTML、圖片、聲音等)的緩存。默認值爲true。 cacheMaxSize:設置靜態資源緩存的最大值,單位爲K。 workDir:指定Web應用的工做目錄。 uppackWAR:若是爲true,會把war文件展開爲開放目錄後再運行。爲false,直接運行war文件。默認值爲true。 十、web.xml文件 該文件必須放在/WEB-INF目錄下,可是從7.0版本開始,Tomcat能夠不使用web.xml文件,而是使用註解方式。
3、Tomcat的優化
一、內存使用配置
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查看設置是否成功windows
二、最大鏈接數配置(併發能力) 在/conf/server.xml裏進行配置 在<Connector>屬性中 將protocol屬性改成 "org.apache.coyote.http11.Http11NioProtocol",NIO模型的效率更高 加入 maxThreads="500" //當前能夠同時處理的最大用戶訪問數 minSpareThreads="100" //最小空閒線程鏈接數,用於優化線程池 maxSpareThreads="200" acceptCount="200" //當全部的線程以分配,仍然容許鏈接進來,可是出於等待狀態的用戶數。等待線程數+工做線程數=總的可最大鏈接數,若是超過此數,新的鏈接將不會被接受,就會產生一個http錯誤 enableLookups="false"//是否容許DNS反查,若是爲true,request.getRemoteHost會執行DNS查找,反向解析ip對應域名或主機名,當沒有這樣須要的時候,能夠將這個功能關閉,在必定程度上提升了Tomcat服務器的性能
4、負載均衡配置
負載均衡是提升應用負載量和容錯的有效手段,能夠結合Nginxs與Tomcat實現,Nginx是一款性能優異的反向代理服務器
一、負載均衡配置實現
反向代理原理示意圖:緩存
負載均衡示意圖: 負載均衡策略: Nginx 提供輪詢(round robin)、用戶IP哈希(client IP)和指定權重 3 種方式 二、負載均衡時Session的處理策略 Session是Tomcat服務器上的內存空間,若是一個用戶發出多個請求,卻發到了多個tomcat服務器中,那麼就會出現Session不一樣步的問題 解決方案1:將一個用戶的請求鎖定到某一臺服務器上,簡單,可是缺少容錯性,一旦某個服務器發生故障,Session可能丟失,(可是服務器發生故障是一個低機率事件,若是一個服務器常常掛掉,要麼是硬件有問題,要麼是應用有問題) 可使用用戶IP哈希實現 解決方案2:Session複製策略,基於網絡的廣播策略,一個節點Session變化,其餘節點同步複製,具備容錯性,但節點多或複製量大時對網絡負荷大,使網絡效率低下,甚至阻塞 ① 在/conf/server.xml文件中開啓Session複製的選項,將<Cluster>註釋去掉,7.0默認值以配置好,須要接收器<Receiver>綁定內網(通常服務器都有兩塊網卡)網卡地址,修改端口>。 ② 在應用中指定應用是在分佈式部署之下,在web.xml中添加<distributable/>選項 解決方案3:額外建立一個共享的空間用來存放Session,全部服務器共享一個Session memcached緩存共享方案基本原理 粘性Session與非粘性Session方式: 須要一些工具jar包,官網有目錄和下載鏈接 在/conf/context.xml中進行配置,全局有效 三、集羣環境中應用代碼應注意的問題 ① 傳遞Session須要實體類序列化支持,實現可序列化接口,設置版本號 ② 獲取用戶IP地址方法的變化,獲取真實客戶端ip而不是Nginx代理地址 ③ 動靜分離結構的預規劃, 通常高併發的網站上,資源類的文件,如js,css,圖片一般是由靜態服務器處理,Nginx處理靜態文件效率就很是高,而tomcat處理靜態文件是它很大的一個弱勢,tomcat只負責動態請求的處理。那麼編碼的時候就要考慮靜態資源最後可能要被拿出去,地址會有變化,因此在開發的時候應該規劃訪問地址,保持最大靈活性。