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服務器的性能。經過沉思我已經知道了和早期版本相比最新的Tomcat提供更好的性能和穩定性。所以一直使用最新的Tomcat版本。現在本文使用下面幾步來提高Tomcat服務器的性能。
- 增加JVM堆內存大小
- 修復JRE內存泄漏
- 線程池設置
- 壓縮
- 數據庫性能調優
- Tomcat本地庫
- 其它選項
第一步 – 提高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",下面,給出這個文件的配置信息,
-Xms – 指定初始化時化的棧內存
-Xms – 指定初始化時化的棧內存
-Xmx – 指定最大棧內存
在重啟你的Tomcat服務器之后,這些配置的更改才會有效。下面將介紹如何處理JRE內存泄漏.
第二步 – 解決JRE內存泄露
性能表現不佳的另一個主要原因是內存泄漏,正如我之前說過:始終使用最新的tomcat服務器以獲得更好的性能和可伸縮性。現在,這句話變成真的。如果我們使用最新的tomcat版本6.0.26及以上就可以解決這個錯誤,因為它包含了一個監聽器來處理JRE和PermGen的內存泄漏。使用的監聽器是,
你可以在server.xml文件中找到這個監聽器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下來,我們將看看如何調整連接屬性“maxThreads”。
第三步 – 線程池設置
線程池指定Web請求負載的數量,因此,為獲得更好的性能這部分應小心處理。可以通過調整連接器屬性“maxThreads”完成設置。maxThreads的值應該根據流量的大小,如果值過低,將有沒有足夠的線程來處理所有的請求,請求將進入等待狀態,只有當一個的處理線程釋放后才被處理;如果設置的太大,Tomcat的啟動將花費更多時間。因此它取決於我們給maxThreads設置一個正確的值。
在上述配置中,maxThreads值設定為“250”,這指定可以由服務器處理的並發請求的最大數量。如果沒有指定,這個屬性的默認值為“200”。任何多出的並發請求將收到“拒絕連接”的錯誤提示,直到另一個處理請求進程被釋放。錯誤看起來如下,
如果應用提示上述錯誤,務必檢查上述錯誤是否是由於單個請求花費太長時間造成的,這個問題的原因是這樣的,有時候如果數據庫連接不釋放的話,進程將不會處理其它請求。
注意: 如果請求的數量超過了“750”,這將不是意味着將maxThreads屬性值設置為“750”,它意外着最好使用“Tomcat集群”的多個實例。也就是說,如果有“1000”請求,兩個Tomcat實例設置“maxThreads= 500”,而不在單Tomcat實例的情況下設置maxThreads=1000。
根據我的經驗,准確值的設定可以通過將應用在在各種環境中測試得出。接下來,我們來看看如何壓縮的MIME類型。
第4步- 壓縮
Tomcat有一個通過在server.xml配置文件中設置壓縮的選項。壓縮可以在connector像如下設置中完成,
<Connector port="8080" protocol="HTTP/1.1"
第五步- 數據庫性能調優
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。
~~~~~~~~~~~~~~~ 2013.11.07~~~~~~~~~~~~~~
設置TOMCAT啟用GZIP壓縮
原理簡介
connectionTimeout="20000"
redirectPort="8443" executor="tomcatThreadPool" URIEncoding="utf-8" compression="on" compressionMinSize="50" noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
- compression="on" 打開壓縮功能
- compressionMinSize="50" 啟用壓縮的輸出內容大小,默認為2KB
- noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啟用壓縮
- compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮
@Test
public void testGzip() {
HttpClient httpClient = new HttpClient();
GetMethod getMethod = new GetMethod("http://localhost/admin.jsp");
try {
getMethod.addRequestHeader("accept-encoding", "gzip,deflate");
getMethod.addRequestHeader("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Alexa Toolbar; Maxthon 2.0)");
int result = httpClient.executeMethod(getMethod);
if (result == 200) {
System.out.println(getMethod.getResponseContentLength());
String html = getMethod.getResponseBodyAsString();
System.out.println(html);
System.out.println(html.getBytes().length);
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
getMethod.releaseConnection();
}
}