Tomcat配置及優化方案

Tomcat 配置詳解/優化方案

 

Service.xml

Server.xml配置文件用於對整個容器進行相關的配置。javascript

<Server>元素:
是整個配置文件的根元素。表示整個Catalina容器。css

屬性:
className:實現了org.apache.catalina.Server接口的類名,標準實現類是org.apache.catalina.core.StandardServer類。
Port:Tomcat服務器監聽用於關閉Tomcat服務器的命令(必須)
Shutdown:發送到端口上用於關閉Tomcat服務器的命令。html

例:
<Serverport=」8005」 shutdown=」SHUTDOWN」>java

<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" />web

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指定的名字相匹配。apache

屬性:
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」 />

 

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",下面,給出這個文件的配置信息,

  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的內存泄漏。使用的監聽器是,

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

你能夠在server.xml文件中找到這個監聽器的配置,server.xml位置在「tomcat project folder/conf/server.xml」。接下來,咱們將看看如何調整鏈接屬性「maxThreads」。

第三步 – 線程池設置

線程池指定Web請求負載的數量,所以,爲得到更好的性能這部分應當心處理。能夠經過調整鏈接器屬性「maxThreads」完成設置。maxThreads的值應該根據流量的大小,若是值太低,將有沒有足夠的線程來處理全部的請求,請求將進入等待狀態,只有當一個的處理線程釋放後才被處理;若是設置的太大,Tomcat的啓動將花費更多時間。所以它取決於咱們給maxThreads設置一個正確的值。

  1. <Connector port="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」。任何多出的併發請求將收到「拒絕鏈接」的錯誤提示,直到另外一個處理請求進程被釋放。錯誤看起來以下,

  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像以下設置中完成,

  1. 1 <Connector port="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。  

 

 

 

設置Tomacat啓動GZIP壓縮

原理簡介

        HTTP 壓縮能夠大大提升瀏覽網站的速度,它的原理是,在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML ,CSS,Javascript , Text ,它能夠節省40%左右的流量。更爲重要的是,它能夠對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。 
 
配置方法
Tomcat5.0之後的版本是支持對輸出內容進行壓縮的,使用的是gzip壓縮格式 。
 
修改%TOMCAT_HOME%/conf/server.xml,修訂節點以下:
  1. <Connector port="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寫一個簡單的測試程序,代碼以下:
  1. @ Test
  2. public void 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大小,若是請求資源小於這個數值,則不會啓用壓縮。
相關文章
相關標籤/搜索