1. 程式人生 > >Tomcat Service.xml配置詳解及優化

Tomcat Service.xml配置詳解及優化

Service.xml

Server.xml配置檔案用於對整個容器進行相關的配置。

<Server>元素:
是整個配置檔案的根元素。表示整個Catalina容器。

屬性:
className:實現了org.apache.catalina.Server介面的類名,標準實現類是org.apache.catalina.core.StandardServer類。
Port:Tomcat伺服器監聽用於關閉Tomcat伺服器的命令(必須)
Shutdown:傳送到埠上用於關閉Tomcat伺服器的命令。

例:
<Serverport=”8005” shutdown=”SHUTDOWN”>

<Connector>元素:
聯結器,負責接收客戶的請求,以及向客戶端回送響應的訊息。

HTTP聯結器:
屬性:
allowTrace:是否允許HTTP的TRACE方法,預設為false
emptySessionPath:如果設定為true,使用者的所有路徑都將設定為/,預設為false。
enableLookups:呼叫request、getRemoteHost()執行DNS查詢,以返回遠端主機的主機名,如果設定為false,則直接返回IP地址。
maxPostSize:指定POST方式請求的最大量,沒有指定預設為2097152。
protocol:值必須為HTTP1.1,如果使用AJP處理器,該值必須為AJP/1.3
proxyName:如這個聯結器正在一個代理配置中被使用,指定這個屬性,在request.getServerName()時返回
redirectPort:如聯結器不支援SSL請求,如收到SSL請求,Catalina容器將會自動重定向指定的埠號,讓其進行處理。
scheme:設定協議的名字,在request.getScheme()時返回,SSL聯結器設為”https”,預設為”http”
secure:在SSL聯結器可將其設定為true,預設為false
URIEncoding:用於解碼URL的字元編碼,沒有指定預設值為ISO-8859-1
useBodyEncodingForURI:主要用於Tomcat4.1.x中,指示是否使用在contentType中指定的編碼來取代URIEncoding,用於解碼URI查詢引數,預設為false
xpoweredBy:為true時,Tomcat使用規範建議的報頭表明支援Servlet的規範版本,預設為false
acceptCount:當所有的可能處理的執行緒都正在使用時,在佇列中排隊請求的最大數目。當佇列已滿,任何接收到的請求都會被拒絕,預設值為10
bufferSize:設由聯結器建立輸入流緩衝區的大小,以位元組為單位。預設情況下,快取區大的大小為2048位元組
compressableMimeType:MIME的列表,預設以逗號分隔。預設值是text/html,text/xml,text/plain
compression:指定是否對響應的資料進行壓縮。off:表示禁止壓縮、on:表示允許壓縮(文字將被壓縮)、force:表示所有情況下都進行壓縮,預設值為off
connectionTimeout:設定連線的超時值,以毫秒為單位。預設值為60000=60秒
disableUploadTimeOut:允許Servlet容器,正在執行使用一個較長的連線超時值,以使Servlet有較長的時間來完成它的執行,預設值為false
maxHttpHeaderSize:HTTP請求和響應頭的最大量,以位元組為單位,預設值為4096位元組
maxKeepAliveRequest:伺服器關閉之前,客戶端傳送的流水線最大數目。預設值為100
maxSpareThreads:允許存在空閒執行緒的最大數目,預設值為50
minSpareThreads:設當聯結器第一次啟協建立執行緒的數目,確保至少有這麼多的空閒執行緒可用。預設值為4
port:服務端套接字監聽的TCP埠號,預設值為8080(必須)
socketBuffer:設Socket輸出緩衝區的大小(以位元組為單位),-1表示禁止緩衝,預設值為9000位元組
toNoDelay:為true時,可以提高效能。預設值為true
threadPriority:設JVM中請求處理執行緒優先順序。預設值為NORMAL-PRIORITY
例:
<Connector 
port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false"
redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />

AJP聯結器:
用於將Apache與Tomcat整合在一起,當Apache接收到動態內容請求時,通過在配置中指定的埠號將請求傳送給在此埠號上監聽的AJP聯結器元件。
屬性:
backlog:當所有可能的請求處理執行緒都在使用時,佇列中排隊的請求最大數目。預設為10,當佇列已滿,任何請求都將被拒絕
maxSpareThread:允許存在空閒執行緒的最大數目,預設值為50
maxThread:最大執行緒數,預設值為200
minSpareThreads:設當聯結器第一次啟動時建立執行緒的數目,確保至少有這麼多的空閒執行緒可用,預設值為4
port:服務端套接字的TCP埠號,預設值為8089(必須)
topNoDelay:為true時,可以提高效能,預設值為true
soTimeout:超時值
例:
<!—Define an AJP1.3 Connector on port 8089-->
<Connector port=”8089” enableLookups=”false” redirectPort=”8443” protocol=”AJP/1.3” />

<Engine>元素:
為特定的Service處理所有的請示。每個Service只能包含一個Engine元素,它負責接收和處理此Service所有的聯結器收到的請求,向連線發回響應,並最終顯示在客戶端。<Engine>至少有一個<Host>元素,必須至少有一個<Host>屬性的名字與defaultHost指定的名字相匹配。

屬性:
className:實現org.apache.catalina.Engine介面,預設實現類為org.apache.catalina.core.StandardEngine類
defaultHost:預設主機名,值必須與<Service>的name值相匹配
name:指定Engine的邏輯名字(必須)
jvmRoute:在負載勻衡中使用的識別符號,必須唯一

例:
<Engine name=”Cataline” defaultHost=”localhst”>

<Host>元素:
表示一個虛擬主機,為特定的虛擬主機處理所有請求

屬性:
appBase:設定應用程式的基目錄,絕對路徑或相對於%CATALINA_HOME%的路徑名
autoDeploy:指示Tomcat執行時,如有新的WEB程式加開appBase指定的目錄下,是否為自動佈署,預設值為true
className:實現了org.apache.catalina.Host介面的類,標準實現類為org.apache.catalina.core.StandardHost類
deployOnStartup:Tomcat啟動時,是否自動部署appBase屬性指定目錄下所有的WEB應用程式,預設值為true
name:虛擬主機的網路名(必須)

標準Host實現類org.apahce.catalina.core.StandardHost支援的附加屬性:
deployXML:為false將不會解析WEB應用程式內部的context.xml,預設值為true
unPackWARs:虛擬主機指定臨時讀寫使用的目錄的路徑名,不設,Tomcat會在%CATALINA_HOME%/work目錄下提供一個合適的目錄。

例:
<Host name=”localhst” appBase=”webapps” unpackWARs=”true” autoDeploy=”true” xmlValidation=”false” xmlNamespaceAware=”false”>
配置虛擬主機:
<Hostname=”xxx” appBase=”c:/test”>
    <Contentpath=”” docBase=”e:/abe”/>
</Hostname>

<context>元素:
一個WEB應用程式,處理當前WEB應用程式的所有請求,每一個<Context>必須使用唯一的上下文路徑。

屬性:
className:實現了org.apache.catalina.Context介面的類,標準實現類org.apache.catalina.core.StandardContext類
cookies:是否將Cookie應用於Session,預設值為true
crossContext:是否允許跨域訪問,為true時,在程式內呼叫ServletContext.getContext()方法將返回一個虛擬主機上其它web程式的請求排程器。預設值為false,調 徑用getContext()返回為null
docBase:絕對路徑或相對於Host的appBase 屬性的相對路徑
privileged:為true,允許Web應用程式使用容器的Servlet
path:指定上下文路徑。一個虛擬主機中,上下文路徑必須唯一
reloadable:為true,Tomcat執行時,如果WEB-INF/classes和WEB-INF/lib目錄中有改變,Tomcat會自動重新載入該WEB應用程式。雖方便,但開銷也大,預設值為false,我們在呼叫可以開啟,釋出後再關閉。
cacheMaxSize:靜態資源快取最大值,以KB為單位,預設值為10240KB
cachingAllowed:是否允許靜態資源快取,預設為true
caseSensitive:預設為true,資原始檔名大小寫敏感,如果為false大小寫不敏感
unpackWAR:預設為true
workDir:為WEB應用程式內部的Servlet指定臨時讀寫的目錄路徑名。如沒有設定,則Tomcat會在%CATALINA_HOME%/work目錄下提供一個合適的目錄

例:
<Content path=”/abc” docBase=”d:/xyz” reloadable=”true” />

~~~~~~~~~~~~~~~~~~Tidied up by Travis.Tang on 2013.11.07~~~~~~~~~~~~~~~

Tomcat效能優化方案整理

考慮一下這種場景,你開發了一個應用,它有十分優秀的佈局設計,最新的特性以及其它的優秀特點。但是在效能這方面欠缺,不管這個應用如何都會遭到客戶拒絕。客戶總是期望它們的應用應該有更好的效能。如果你在產品中使用了Tomcat伺服器,那麼這篇文章就會給你幾方面來提升Tomcat伺服器的效能。感謝ITWorld article給本文提供資源。經過沉思我已經知道了和早期版本相比最新的Tomcat提供更好的效能和穩定性。所以一直使用最新的Tomcat版本。現在本文使用下面幾步來提高Tomcat伺服器的效能。

  1. 增加JVM堆記憶體大小
  2. 修復JRE記憶體洩漏
  3. 執行緒池設定
  4. 壓縮
  5. 資料庫效能調優
  6. Tomcat本地庫
  7. 其它選項 

第一步  – 提高JVM棧記憶體Increase JVM heap memory

你使用過tomcat的話,簡單的說就是“記憶體溢位”. 通常情況下,這種問題出現在實際的生產環境中.產生這種問題的原因是tomcat使用較少的記憶體給程序,通過配置TOmcat的配置檔案(Windows 下的catalina.bat或Linux下的catalina.sh)可以解決這種問題.這種解決方法是通過增加JVM的棧記憶體實現的.也就是說,JVM通常不去呼叫垃圾回收器,所以伺服器可以更多關注處理web請求,並要求儘快完成。要更改檔案(catalina.sh) 位於"\tomcat server folder\bin\catalina.sh",下面,給出這個檔案的配置資訊,

[plain] view plain copy    print?
  1. JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8  
  2.     -server -Xms1024m -Xmx1024m  
  3.     -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m  
  4.     -XX:MaxPermSize=512m -XX:+DisableExplicitGC"  

-Xms – 指定初始化時化的棧記憶體

-Xms – 指定初始化時化的棧記憶體
-Xmx – 指定最大棧記憶體
在重啟你的Tomcat伺服器之後,這些配置的更改才會有效。下面將介紹如何處理JRE記憶體洩漏.  

第二步 – 解決JRE記憶體洩露

效能表現不佳的另一個主要原因是記憶體洩漏,正如我之前說過:始終使用最新的tomcat伺服器以獲得更好的效能和可伸縮性。現在,這句話變成真的。如果我們使用最新的tomcat版本6.0.26及以上就可以解決這個錯誤,因為它包含了一個監聽器來處理JRE和PermGen的記憶體洩漏。使用的監聽器是,

[html] view plain copy    print?
  1. <ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>

你可以在server.xml檔案中找到這個監聽器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下來,我們將看看如何調整連線屬性“maxThreads”。

第三步 – 執行緒池設定

執行緒池指定Web請求負載的數量,因此,為獲得更好的效能這部分應小心處理。可以通過調整聯結器屬性“maxThreads”完成設定。maxThreads的值應該根據流量的大小,如果值過低,將有沒有足夠的執行緒來處理所有的請求,請求將進入等待狀態,只有當一個的處理執行緒釋放後才被處理;如果設定的太大,Tomcat的啟動將花費更多時間。因此它取決於我們給maxThreads設定一個正確的值

[html] view plain copy    print?
  1. <Connectorport="8080"address="localhost"
  2. 2   maxThreads="250"maxHttpHeaderSize="8192"
  3. 3   emptySessionPath="true"protocol="HTTP/1.1"
  4. 4   enableLookups="false"redirectPort="8181"acceptCount="100"
  5. 5   connectionTimeout="20000"disableUploadTimeout="true"/>

在上述配置中,maxThreads值設定為“250”,這指定可以由伺服器處理的併發請求的最大數量。如果沒有指定,這個屬性的預設值為“200”。任何多出的併發請求將收到“拒絕連線”的錯誤提示,直到另一個處理請求程序被釋放。錯誤看起來如下,

[java] view plain copy    print?
  1. org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) are  
  2. currently busy, waiting. Increase maxThreads (250) or check the servlet status  

如果應用提示上述錯誤,務必檢查上述錯誤是否是由於單個請求花費太長時間造成的,這個問題的原因是這樣的,有時候如果資料庫連線不釋放的話,程序將不會處理其它請求。  

注意: 如果請求的數量超過了“750”,這將不是意味著將maxThreads屬性值設定為“750”,它意外著最好使用“Tomcat叢集”的多個例項。也就是說,如果有“1000”請求,兩個Tomcat例項設定“maxThreads= 500”,而不在單Tomcat例項的情況下設定maxThreads=1000。

根據我的經驗,準確值的設定可以通過將應用在在各種環境中測試得出。接下來,我們來看看如何壓縮的MIME型別。

第4步- 壓縮

Tomcat有一個通過在server.xml配置檔案中設定壓縮的選項。壓縮可以在connector像如下設定中完成,

[html] view plain copy    print?
  1. 1   <Connectorport="8080"protocol="HTTP/1.1"
  2. 2   connectionTimeout="20000"
  3. 3   redirectPort="8181"compression="500"
  4. 4   compressableMimeType="text/html,text/xml,text/plain,application/octet-stream"/>
在前面的配置中,當檔案的大小大於等於500bytes時才會壓縮。如果當檔案達到了大小但是卻沒有被壓縮,那麼設定屬性compression="on"。否則Tomcat預設設定是“off”。接下來我們將看看如何調優資料庫。  

第五步- 資料庫效能調優

Tomcat效能在等待資料庫查詢被執行期間會降低。如今大多數應用程式都是使用可能包含“命名查詢”的關係型資料庫。如果是那樣的話,Tomcat會在啟動時預設載入命名查詢,這個可能會提升效能。另一件重要事是確保所有資料庫連線正確地關閉。給資料庫連線池設定正確值也是十分重要的。我所說的值是指Resource要素的最大空閒數(maxIdle),最大連線數(maxActive),最大建立連線等待時間(maxWait)屬性的值。因為配置依賴與應用要求,我也不能在本文指定正確的值。你可以通過呼叫資料庫效能測試來找到正確的值。  

第6步 – Tomcat原生庫

Tomcat的原生庫基於Apache可移植執行時(Apache Portable Runtime簡稱APR),給程式設計師提供了超強的擴充套件性和效能,在產品運作中幫助融合原生的伺服器技術以展現最佳的效能。想知道安裝說明的朋友請參考Tomcat Native Library – (APR) Installation。 

第7步 – 其他選項

這些選項是:

  • 開啟瀏覽器的快取,這樣讀取存放在webapps資料夾裡的靜態內容會更快,大大推動整體效能。
  • 每當開機時,Tomcat伺服器應當自動地重啟。
  • 一般情況下HTTPS請求會比HTTP請求慢。如果你想要更好的安全性,即使慢一點我們還是要選擇HTTPS。  
~~~~~~~~~~~~~~~~Tidied up by Travis.Tang on 2013.11.07~~~~~~~~~~~~~~

設定TOMCAT啟用GZIP壓縮

原理簡介

        HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求伺服器對應資源後,從伺服器端將資原始檔壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML ,CSS,Javascript , Text ,它可以節省40%左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。  配置方法 Tomcat5.0以後的版本是支援對輸出內容進行壓縮的,使用的是gzip壓縮格式 。 修改%TOMCAT_HOME%/conf/server.xml,修訂節點如下: [html] view plain copy    print?
  1. <Connectorport="80"protocol="HTTP/1.1"
  2.         connectionTimeout="20000"
  3.         redirectPort="8443"executor="tomcatThreadPool"URIEncoding="utf-8"
  4.                     compression="on"
  5.                     compressionMinSize="50"noCompressionUserAgents="gozilla, traviata"
  6.                     compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>
  從上面節點的屬性可以看出,要使用gzip壓縮功能,你需要在Connector節點中加上如下屬性
  • compression="on" 開啟壓縮功能 
  • compressionMinSize="50" 啟用壓縮的輸出內容大小,預設為2KB 
  • noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啟用壓縮 
  • compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源型別需要壓縮
測試方法 啟用了TOMCAT這個壓縮功能後,我們如何來測試壓縮是否有效呢? 首先Tomcat是根據瀏覽器請求頭中的accept-encoding來判斷瀏覽器是否支援壓縮功能,如果這個值包含有gzip,就表明瀏覽器支援gzip壓縮內容的瀏覽,我們可以用兩種方法來驗證壓縮是否生效。 大家直接通過瀏覽器訪問啟用了壓縮配置的伺服器,然後通過抓包工具檢視抓到的資料包,如果內容有很多你看不懂,就說明已經啟用壓縮功能了。 通過程式模擬請求
我們用httpclient寫一個簡單的測試程式,程式碼如下: [java] view plain copy    print?
  1. @Test
  2.     publicvoid testGzip() {    
  3.             HttpClient httpClient = new HttpClient();    
  4.             GetMethod getMethod = new GetMethod("http://localhost/admin.jsp");    
  5.             try {    
  6.                     getMethod.addRequestHeader("accept-encoding""gzip,deflate");    
  7.                     getMethod.addRequestHeader("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Alexa Toolbar; Maxthon 2.0)");    
  8.                     int result = httpClient.executeMethod(getMethod);    
  9.                     if (result == 200) {    
  10.                             System.out.println(getMethod.getResponseContentLength());    
  11.                             String html = getMethod.getResponseBodyAsString();    
  12.                             System.out.println(html);    
  13.                             System.out.println(html.getBytes().length);    
  14.                     }    
  15.             } catch (HttpException e) {    
  16.                     e.printStackTrace();    
  17.             } catch (IOException e) {    
  18.                     e.printStackTrace();    
  19.             } finally {    
  20.                     getMethod.releaseConnection();    
  21.             }    
  22.     }    
  執行這個junit程式,看看它所輸出的是什麼內容,如果輸出的是一些亂碼,並且列印內容的長度遠小於實際的長度,就說明我們的配置生效了,通過一些其它驗證工具,會發現網站瀏覽速度會明顯提升。 備註:如果發現內容沒有被壓縮,可以考慮調整compressionMinSize大小,如果請求資源小於這個數值,則不會啟用壓縮。