Service.xml
Server.xml配置文件用于對(duì)整個(gè)容器進(jìn)行相關(guān)的配置。
<Server>元素:是整個(gè)配置文件的根元素。表示整個(gè)Catalina容器。
屬性:className:實(shí)現(xiàn)了org.Apache.catalina.Server接口的類名,標(biāo)準(zhǔn)實(shí)現(xiàn)類是org.apache.catalina.core.StandardServer類。Port:Tomcat服務(wù)器監(jiān)聽用于關(guān)閉Tomcat服務(wù)器的命令(必須)Shutdown:發(fā)送到端口上用于關(guān)閉Tomcat服務(wù)器的命令。
例:<Serverport=”8005” shutdown=”SHUTDOWN”>
<Connector>元素:連接器,負(fù)責(zé)接收客戶的請(qǐng)求,以及向客戶端回送響應(yīng)的消息。
HTTP連接器:屬性:
- allowTrace:是否允許HTTP的TRACE方法,默認(rèn)為false
- emptySessionPath:如果設(shè)置為true,用戶的所有路徑都將設(shè)置為/,默認(rèn)為false。
- enableLookups:調(diào)用request、getRemoteHost()執(zhí)行DNS查詢,以返回遠(yuǎn)程主機(jī)的主機(jī)名,如果設(shè)置為false,則直接返回IP地址。
- maxPostSize:指定POST方式請(qǐng)求的最大量,沒有指定默認(rèn)為2097152。
- protocol:值必須為HTTP1.1,如果使用AJP處理器,該值必須為AJP/1.3
- proxyName:如這個(gè)連接器正在一個(gè)代理配置中被使用,指定這個(gè)屬性,在request.getServerName()時(shí)返回
- redirectPort:如連接器不支持SSL請(qǐng)求,如收到SSL請(qǐng)求,Catalina容器將會(huì)自動(dòng)重定向指定的端口號(hào),讓其進(jìn)行處理。
- scheme:設(shè)置協(xié)議的名字,在request.getScheme()時(shí)返回,SSL連接器設(shè)為”https”,默認(rèn)為”http”
- secure:在SSL連接器可將其設(shè)置為true,默認(rèn)為false
- URIEncoding:用于解碼URL的字符編碼,沒有指定默認(rèn)值為ISO-8859-1
- useBodyEncodingForURI:主要用于Tomcat4.1.x中,指示是否使用在contentType中指定的編碼來取代URIEncoding,用于解碼URI查詢參數(shù),默認(rèn)為false
- xpoweredBy:為true時(shí),Tomcat使用規(guī)范建議的報(bào)頭表明支持Servlet的規(guī)范版本,默認(rèn)為false
- acceptCount:當(dāng)所有的可能處理的線程都正在使用時(shí),在隊(duì)列中排隊(duì)請(qǐng)求的最大數(shù)目。當(dāng)隊(duì)列已滿,任何接收到的請(qǐng)求都會(huì)被拒絕,默認(rèn)值為10
- bufferSize:設(shè)由連接器創(chuàng)建輸入流緩沖區(qū)的大小,以字節(jié)為單位。默認(rèn)情況下,緩存區(qū)大的大小為2048字節(jié)
- compressableMimeType:MIME的列表,默認(rèn)以逗號(hào)分隔。默認(rèn)值是text/html,text/xml,text/plain
- compression:指定是否對(duì)響應(yīng)的數(shù)據(jù)進(jìn)行壓縮。off:表示禁止壓縮、on:表示允許壓縮(文本將被壓縮)、force:表示所有情況下都進(jìn)行壓縮,默認(rèn)值為off
- connectionTimeout:設(shè)置連接的超時(shí)值,以毫秒為單位。默認(rèn)值為60000=60秒
- disableUploadTimeOut:允許Servlet容器,正在執(zhí)行使用一個(gè)較長的連接超時(shí)值,以使Servlet有較長的時(shí)間來完成它的執(zhí)行,默認(rèn)值為false
- maxHttpHeaderSize:HTTP請(qǐng)求和響應(yīng)頭的最大量,以字節(jié)為單位,默認(rèn)值為4096字節(jié)
- maxKeepAliveRequest:服務(wù)器關(guān)閉之前,客戶端發(fā)送的流水線最大數(shù)目。默認(rèn)值為100
- maxSpareThreads:允許存在空閑線程的最大數(shù)目,默認(rèn)值為50
- minSpareThreads:設(shè)當(dāng)連接器第一次啟協(xié)創(chuàng)建線程的數(shù)目,確保至少有這么多的空閑線程可用。默認(rèn)值為4
- port:服務(wù)端套接字監(jiān)聽的TCP端口號(hào),默認(rèn)值為8080(必須)
- socketBuffer:設(shè)Socket輸出緩沖區(qū)的大小(以字節(jié)為單位),-1表示禁止緩沖,默認(rèn)值為9000字節(jié)
- toNoDelay:為true時(shí),可以提高性能。默認(rèn)值為true
- threadPriority:設(shè)JVM中請(qǐng)求處理線程優(yōu)先級(jí)。默認(rèn)值為NORMAL-PRIORITY
例:
<Connector port="8080" address="localhost"maxThreads="250" maxHttpHeaderSize="8192"emptySessionPath="true" protocol="HTTP/1.1"enableLookups="false" redirectPort="8181" acceptCount="100"connectionTimeout="20000" disableUploadTimeout="true" />
AJP連接器:用于將Apache與Tomcat集成在一起,當(dāng)Apache接收到動(dòng)態(tài)內(nèi)容請(qǐng)求時(shí),通過在配置中指定的端口號(hào)將請(qǐng)求發(fā)送給在此端口號(hào)上監(jiān)聽的AJP連接器組件。
屬性:
- backlog:當(dāng)所有可能的請(qǐng)求處理線程都在使用時(shí),隊(duì)列中排隊(duì)的請(qǐng)求最大數(shù)目。默認(rèn)為10,當(dāng)隊(duì)列已滿,任何請(qǐng)求都將被拒絕
- maxSpareThread:允許存在空閑線程的最大數(shù)目,默認(rèn)值為50
- maxThread:最大線程數(shù),默認(rèn)值為200
- minSpareThreads:設(shè)當(dāng)連接器第一次啟動(dòng)時(shí)創(chuàng)建線程的數(shù)目,確保至少有這么多的空閑線程可用,默認(rèn)值為4
- port:服務(wù)端套接字的TCP端口號(hào),默認(rèn)值為8089(必須)
- topNoDelay:為true時(shí),可以提高性能,默認(rèn)值為true
- soTimeout:超時(shí)值
例:
<!—Define an AJP1.3 Connector on port 8089--><Connector port=”8089” enableLookups=”false” redirectPort=”8443” protocol=”AJP/1.3” />
<Engine>元素:為特定的Service處理所有的請(qǐng)示。每個(gè)Service只能包含一個(gè)Engine元素,它負(fù)責(zé)接收和處理此Service所有的連接器收到的請(qǐng)求,向連接發(fā)回響應(yīng),并最終顯示在客戶端。<Engine>至少有一個(gè)<Host>元素,必須至少有一個(gè)<Host>屬性的名字與defaultHost指定的名字相匹配。
屬性:className:實(shí)現(xiàn)org.apache.catalina.Engine接口,默認(rèn)實(shí)現(xiàn)類為org.apache.catalina.core.StandardEngine類defaultHost:默認(rèn)主機(jī)名,值必須與<Service>的name值相匹配name:指定Engine的邏輯名字(必須)jvmRoute:在負(fù)載勻衡中使用的標(biāo)識(shí)符,必須唯一
例:<Engine name=”Cataline” defaultHost=”localhst”>
<Host>元素:表示一個(gè)虛擬主機(jī),為特定的虛擬主機(jī)處理所有請(qǐng)求
屬性:
- AppBase:設(shè)定應(yīng)用程序的基目錄,絕對(duì)路徑或相對(duì)于%CATALINA_HOME%的路徑名
- autoDeploy:指示Tomcat運(yùn)行時(shí),如有新的WEB程序加開appBase指定的目錄下,是否為自動(dòng)布署,默認(rèn)值為true
- className:實(shí)現(xiàn)了org.apache.catalina.Host接口的類,標(biāo)準(zhǔn)實(shí)現(xiàn)類為org.apache.catalina.core.StandardHost類
- deployOnStartup:Tomcat啟動(dòng)時(shí),是否自動(dòng)部署appBase屬性指定目錄下所有的WEB應(yīng)用程序,默認(rèn)值為true
- name:虛擬主機(jī)的網(wǎng)絡(luò)名(必須)
- 標(biāo)準(zhǔn)Host實(shí)現(xiàn)類org.apahce.catalina.core.StandardHost支持的附加屬性:
- deployXML:為false將不會(huì)解析WEB應(yīng)用程序內(nèi)部的context.xml,默認(rèn)值為true
- unPackWARs:虛擬主機(jī)指定臨時(shí)讀寫使用的目錄的路徑名,不設(shè),Tomcat會(huì)在%CATALINA_HOME%/work目錄下提供一個(gè)合適的目錄。
例:<Host name=”localhst” appBase=”webapps” unpackWARs=”true” autoDeploy=”true” xmlValidation=”false” xmlNamespaceAware=”false”>配置虛擬主機(jī):<Hostname=”xxx” appBase=”c:/test”> <Contentpath=”” docBase=”e:/abe”/></Hostname>
<context>元素:一個(gè)WEB應(yīng)用程序,處理當(dāng)前WEB應(yīng)用程序的所有請(qǐng)求,每一個(gè)<Context>必須使用唯一的上下文路徑。
屬性:
- className:實(shí)現(xiàn)了org.apache.catalina.Context接口的類,標(biāo)準(zhǔn)實(shí)現(xiàn)類org.apache.catalina.core.StandardContext類
- cookies:是否將Cookie應(yīng)用于Session,默認(rèn)值為true
- crossContext:是否允許跨域訪問,為true時(shí),在程序內(nèi)調(diào)用ServletContext.getContext()方法將返回一個(gè)虛擬主機(jī)上其它web程序的請(qǐng)求調(diào)度器。默認(rèn)值為false,調(diào) 徑用getContext()返回為null
- docBase:絕對(duì)路徑或相對(duì)于Host的appBase 屬性的相對(duì)路徑
- privileged:為true,允許Web應(yīng)用程序使用容器的Servlet
- path:指定上下文路徑。一個(gè)虛擬主機(jī)中,上下文路徑必須唯一
- reloadable:為true,Tomcat運(yùn)行時(shí),如果WEB-INF/classes和WEB-INF/lib目錄中有改變,Tomcat會(huì)自動(dòng)重新加載該WEB應(yīng)用程序。雖方便,但開銷也大,默認(rèn)值為false,我們?cè)谡{(diào)用可以打開,發(fā)布后再關(guān)閉。
- cacheMaxSize:靜態(tài)資源緩存最大值,以KB為單位,默認(rèn)值為10240KB
- cachingAllowed:是否允許靜態(tài)資源緩存,默認(rèn)為true
- caseSensitive:默認(rèn)為true,資源文件名大小寫敏感,如果為false大小寫不敏感
- unpackWAR:默認(rèn)為true
- workDir:為WEB應(yīng)用程序內(nèi)部的Servlet指定臨時(shí)讀寫的目錄路徑名。如沒有設(shè)置,則Tomcat會(huì)在%CATALINA_HOME%/work目錄下提供一個(gè)合適的目錄
例:<Content path=”/abc” docBase=”d:/xyz” reloadable=”true” />
Tomcat性能優(yōu)化方案整理
考慮一下這種場(chǎng)景,你開發(fā)了一個(gè)應(yīng)用,它有十分優(yōu)秀的布局設(shè)計(jì),最新的特性以及其它的優(yōu)秀特點(diǎn)。但是在性能這方面欠缺,不管這個(gè)應(yīng)用如何都會(huì)遭到客戶拒絕。客戶總是期望它們的應(yīng)用應(yīng)該有更好的性能。如果你在產(chǎn)品中使用了Tomcat服務(wù)器,那么這篇文章就會(huì)給你幾方面來提升Tomcat服務(wù)器的性能。感謝ITWorld article給本文提供資源。經(jīng)過沉思我已經(jīng)知道了和早期版本相比最新的Tomcat提供更好的性能和穩(wěn)定性。所以一直使用最新的Tomcat版本。現(xiàn)在本文使用下面幾步來提高Tomcat服務(wù)器的性能。
- 增加JVM堆內(nèi)存大小
- 修復(fù)JRE內(nèi)存泄漏
- 線程池設(shè)置
- 壓縮
- 數(shù)據(jù)庫性能調(diào)優(yōu)
- Tomcat本地庫
- 其它選項(xiàng)
第一步 – 提高JVM棧內(nèi)存Increase JVM heap memory
你使用過tomcat的話,簡(jiǎn)單的說就是“內(nèi)存溢出”. 通常情況下,這種問題出現(xiàn)在實(shí)際的生產(chǎn)環(huán)境中.產(chǎn)生這種問題的原因是tomcat使用較少的內(nèi)存給進(jìn)程,通過配置Tomcat的配置文件(windows 下的catalina.bat或linux下的catalina.sh)可以解決這種問題.這種解決方法是通過增加JVM的棧內(nèi)存實(shí)現(xiàn)的.也就是說,JVM通常不去調(diào)用垃圾回收器,所以服務(wù)器可以更多關(guān)注處理web請(qǐng)求,并要求盡快完成。要更改文件(catalina.sh) 位于"tomcat server folderbincatalina.sh",下面,給出這個(gè)文件的配置信息,
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8-server -Xms1024m -Xmx1024m-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m-XX:MaxPermSize=512m -XX:+DisableExplicitGC"
-Xms – 指定初始化時(shí)化的棧內(nèi)存
-Xms – 指定初始化時(shí)化的棧內(nèi)存-Xmx – 指定最大棧內(nèi)存在重啟你的Tomcat服務(wù)器之后,這些配置的更改才會(huì)有效。下面將介紹如何處理JRE內(nèi)存泄漏.
第二步 – 解決JRE內(nèi)存泄露
性能表現(xiàn)不佳的另一個(gè)主要原因是內(nèi)存泄漏,正如我之前說過:始終使用最新的tomcat服務(wù)器以獲得更好的性能和可伸縮性。現(xiàn)在,這句話變成真的。如果我們使用最新的tomcat版本6.0.26及以上就可以解決這個(gè)錯(cuò)誤,因?yàn)樗艘粋€(gè)監(jiān)聽器來處理JRE和PermGen的內(nèi)存泄漏。使用的監(jiān)聽器是,
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
你可以在server.xml文件中找到這個(gè)監(jiān)聽器的配置,server.xml位置在“tomcat project folder/conf/server.xml”。接下來,我們將看看如何調(diào)整連接屬性“maxThreads”。
第三步 – 線程池設(shè)置
線程池指定Web請(qǐng)求負(fù)載的數(shù)量,因此,為獲得更好的性能這部分應(yīng)小心處理。可以通過調(diào)整連接器屬性“maxThreads”完成設(shè)置。maxThreads的值應(yīng)該根據(jù)流量的大小,如果值過低,將有沒有足夠的線程來處理所有的請(qǐng)求,請(qǐng)求將進(jìn)入等待狀態(tài),只有當(dāng)一個(gè)的處理線程釋放后才被處理;如果設(shè)置的太大,Tomcat的啟動(dòng)將花費(fèi)更多時(shí)間。因此它取決于我們給maxThreads設(shè)置一個(gè)正確的值。
<Connector port="8080" address="localhost"maxThreads="250" maxHttpHeaderSize="8192"emptySessionPath="true" protocol="HTTP/1.1"enableLookups="false" redirectPort="8181" acceptCount="100"connectionTimeout="20000" disableUploadTimeout="true" />
在上述配置中,maxThreads值設(shè)定為“250”,這指定可以由服務(wù)器處理的并發(fā)請(qǐng)求的最大數(shù)量。如果沒有指定,這個(gè)屬性的默認(rèn)值為“200”。任何多出的并發(fā)請(qǐng)求將收到“拒絕連接”的錯(cuò)誤提示,直到另一個(gè)處理請(qǐng)求進(jìn)程被釋放。錯(cuò)誤看起來如下,
org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (250) arecurrently busy, waiting. Increase maxThreads (250) or check the servlet status
如果應(yīng)用提示上述錯(cuò)誤,務(wù)必檢查上述錯(cuò)誤是否是由于單個(gè)請(qǐng)求花費(fèi)太長時(shí)間造成的,這個(gè)問題的原因是這樣的,有時(shí)候如果數(shù)據(jù)庫連接不釋放的話,進(jìn)程將不會(huì)處理其它請(qǐng)求。
注意: 如果請(qǐng)求的數(shù)量超過了“750”,這將不是意味著將maxThreads屬性值設(shè)置為“750”,它意外著最好使用“Tomcat集群”的多個(gè)實(shí)例。也就是說,如果有“1000”請(qǐng)求,兩個(gè)Tomcat實(shí)例設(shè)置“maxThreads= 500”,而不在單Tomcat實(shí)例的情況下設(shè)置maxThreads=1000。根據(jù)我的經(jīng)驗(yàn),準(zhǔn)確值的設(shè)定可以通過將應(yīng)用在在各種環(huán)境中測(cè)試得出。接下來,我們來看看如何壓縮的MIME類型。
第4步- 壓縮
Tomcat有一個(gè)通過在server.xml配置文件中設(shè)置壓縮的選項(xiàng)。壓縮可以在connector像如下設(shè)置中完成,
??????
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8181" compression="500" compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />
在前面的配置中,當(dāng)文件的大小大于等于500bytes時(shí)才會(huì)壓縮。如果當(dāng)文件達(dá)到了大小但是卻沒有被壓縮,那么設(shè)置屬性compression="on"。否則Tomcat默認(rèn)設(shè)置是“off”。接下來我們將看看如何調(diào)優(yōu)數(shù)據(jù)庫。
第五步- 數(shù)據(jù)庫性能調(diào)優(yōu)
Tomcat性能在等待數(shù)據(jù)庫查詢被執(zhí)行期間會(huì)降低。如今大多數(shù)應(yīng)用程序都是使用可能包含“命名查詢”的關(guān)系型數(shù)據(jù)庫。如果是那樣的話,Tomcat會(huì)在啟動(dòng)時(shí)默認(rèn)加載命名查詢,這個(gè)可能會(huì)提升性能。另一件重要事是確保所有數(shù)據(jù)庫連接正確地關(guān)閉。給數(shù)據(jù)庫連接池設(shè)置正確值也是十分重要的。我所說的值是指Resource要素的最大空閑數(shù)(maxIdle),最大連接數(shù)(maxActive),最大建立連接等待時(shí)間(maxWait)屬性的值。因?yàn)榕渲靡蕾嚺c應(yīng)用要求,我也不能在本文指定正確的值。你可以通過調(diào)用數(shù)據(jù)庫性能測(cè)試來找到正確的值。
第6步 – Tomcat原生庫
Tomcat的原生庫基于Apache可移植運(yùn)行時(shí)(Apache Portable Runtime簡(jiǎn)稱APR),給程序員提供了超強(qiáng)的擴(kuò)展性和性能,在產(chǎn)品運(yùn)作中幫助融合原生的服務(wù)器技術(shù)以展現(xiàn)最佳的性能。想知道安裝說明的朋友請(qǐng)參考Tomcat Native Library – (APR) Installation。
第7步 – 其他選項(xiàng)
這些選項(xiàng)是:
- 開啟瀏覽器的緩存,這樣讀取存放在webapps文件夾里的靜態(tài)內(nèi)容會(huì)更快,大大推動(dòng)整體性能。
- 每當(dāng)開機(jī)時(shí),Tomcat服務(wù)器應(yīng)當(dāng)自動(dòng)地重啟。
- 一般情況下HTTPS請(qǐng)求會(huì)比HTTP請(qǐng)求慢。如果你想要更好的安全性,即使慢一點(diǎn)我們還是要選擇HTTPS。
~~~~~~~~~~~~~~~~Tidied up by Travis.Tang on 2013.11.07~~~~~~~~~~~~~~
設(shè)置TOMCAT啟用GZIP壓縮
原理簡(jiǎn)介
HTTP 壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是,在客戶端請(qǐng)求服務(wù)器對(duì)應(yīng)資源后,從服務(wù)器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負(fù)責(zé)解壓縮并瀏覽。相對(duì)于普通的瀏覽過程HTML ,css,JavaScript , Text ,它可以節(jié)省40%左右的流量。更為重要的是,它可以對(duì)動(dòng)態(tài)生成的,包括CGI、php , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁也能進(jìn)行壓縮,壓縮效率也很高。
配置方法
Tomcat5.0以后的版本是支持對(duì)輸出內(nèi)容進(jìn)行壓縮的,使用的是gzip壓縮格式 。
修改%TOMCAT_HOME%/conf/server.xml,修訂節(jié)點(diǎn)如下:
<Connector port="80" protocol="HTTP/1.1"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" />
從上面節(jié)點(diǎn)的屬性可以看出,要使用gzip壓縮功能,你需要在Connector節(jié)點(diǎn)中加上如下屬性
- compression="on" 打開壓縮功能
- compressionMinSize="50" 啟用壓縮的輸出內(nèi)容大小,默認(rèn)為2KB
- noCompressionUserAgents="gozilla, traviata" 對(duì)于以下的瀏覽器,不啟用壓縮
- compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮
測(cè)試方法
啟用了TOMCAT這個(gè)壓縮功能后,我們?nèi)绾蝸頊y(cè)試壓縮是否有效呢?
首先Tomcat是根據(jù)瀏覽器請(qǐng)求頭中的accept-encoding來判斷瀏覽器是否支持壓縮功能,如果這個(gè)值包含有g(shù)zip,就表明瀏覽器支持gzip壓縮內(nèi)容的瀏覽,我們可以用兩種方法來驗(yàn)證壓縮是否生效。
大家直接通過瀏覽器訪問啟用了壓縮配置的服務(wù)器,然后通過抓包工具查看抓到的數(shù)據(jù)包,如果內(nèi)容有很多你看不懂,就說明已經(jīng)啟用壓縮功能了。
通過程序模擬請(qǐng)求
我們用httpclient寫一個(gè)簡(jiǎn)單的測(cè)試程序,代碼如下:
@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(); } }
執(zhí)行這個(gè)junit程序,看看它所輸出的是什么內(nèi)容,如果輸出的是一些亂碼,并且打印內(nèi)容的長度遠(yuǎn)小于實(shí)際的長度,就說明我們的配置生效了,通過一些其它驗(yàn)證工具,會(huì)發(fā)現(xiàn)網(wǎng)站瀏覽速度會(huì)明顯提升。
備注:如果發(fā)現(xiàn)內(nèi)容沒有被壓縮,可以考慮調(diào)整compressionMinSize大小,如果請(qǐng)求資源小于這個(gè)數(shù)值,則不會(huì)啟用壓縮。