tomcat優化之server.xml
#vim $TOMCAT_HOME/conf/server.xml
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> <Listener className="org.apache.catalina.core.JasperListener" /> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html --> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="1000" connectionTimeout="20000" maxHttpHeaderSize="8192" tcpNoDelay="true" compression="on" compressionMinSize="4096" disableUploadTimeout="true" enableLookups="false" URIEncoding="UTF-8"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> </Engine> </Service> </Server>
1)port:代表Tomcat監聽埠,也就是網站的訪問埠,預設為8080,可以根據需要改成其他。
2)protocol:協議型別,可選型別有四種,分別為BIO(阻塞型IO),NIO,NIO2和APR。
(1)BIO:BIO(Blocking I/O),顧名思義,即阻塞式I/O操作,表示Tomcat使用的是傳統的Java I/O操作(即java.io包及其子包)。Tomcat在預設情況下,是以bio模式執行的。遺憾的是,就一般而言,bio模式是三種執行模式中效能最低的一種。BIO配置採用預設即可。
(2)NIO:NIO(New I/O),是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操作的java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的併發執行效能。
(3)APR:APR(Apache Portable Runtime/Apache可移植執行時),是Apache HTTP伺服器的支援庫。你可以簡單地理解為:Tomcat將以JNI的形式呼叫 Apache HTTP伺服器的核心動態連結庫來處理檔案讀取或網路傳輸操作,從而大大地提高 Tomcat對靜態檔案的處理效能。
三種協議配置
//BIO
protocol="HTTP/1.1"
//NIO
protocol="org.apache.coyote.http11.Http11NioProtocol"
//NIO2
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
//APR
protocol="org.apache.coyote.http11.Http11AprProtocol"
3)maxThreads:由該聯結器建立的處理請求執行緒的最大數目,也就是可以處理的同時請求的最大數目。如果未配置預設值為200。如果一個執行器與此聯結器關聯,則忽略此屬性,因為該屬性將被忽略,所以該聯結器將使用執行器而不是一個內部執行緒池來執行任務。
maxThreads是一個重要的配置屬性,maxThreads配置的合理直接影響了Tomcat的相關效能,所以這裡我們重點討論下。
maxThreads並不是配置的越大越好,事實上你即使配置成999999也是沒有用的,因為這個最大值是受作業系統及相關硬體所制約的,並且最大值並不一定是最優值,所以我們追尋的應該是最優值而不是最大值。
4)minSpareThreads:執行緒的最小執行數目,這些始終保持執行。如果未指定,預設值為10。
5)acceptCount:當所有可能的請求處理執行緒都在使用時傳入連線請求的最大佇列長度。如果未指定,預設值為100。一般是設定的跟 maxThreads一樣或一半,此值設定的過大會導致排隊的請求超時而未被處理。所以這個值應該是主要根據應用的訪問峰值與平均值來權衡配置。
6)maxConnections:在任何給定的時間內,伺服器將接受和處理的最大連線數。當這個數字已經達到時,伺服器將接受但不處理,等待進一步連線。NIO與NIO2的預設值為10000,APR預設值為8192。
7)connectionTimeout:當請求已經被接受,但未被處理,也就是等待中的超時時間。單位為毫秒,預設值為60000。通常情況下設定為30000。
8)maxHttpHeaderSize:請求和響應的HTTP頭的最大大小,以位元組為單位指定。如果沒有指定,這個屬性被設定為8192(8 KB)。
9)tcpNoDelay:如果為true,伺服器socket會設定TCP_NO_DELAY選項,在大多數情況下可以提高效能。預設情況下設為true。
10)compression:是否啟用gzip壓縮,預設為關閉狀態。這個引數的可接受值為“off”(不使用壓縮),“on”(壓縮文字資料),“force”(在所有的情況下強制壓縮)。
11)compressionMinSize:如果compression="on",則啟用此項。被壓縮前資料的最小值,也就是超過這個值後才被壓縮。如果沒有指定,這個屬性預設為“2048”(2K),單位為byte。
12)disableUploadTimeout:這個標誌允許servlet Container在一個servlet執行的時候,使用一個不同的,更長的連線超時。最終的結果是給servlet更長的時間以便完成其執行,或者在資料上載的時候更長的超時時間。如果沒有指定,設為false。
13)enableLookups:關閉DNS反向查詢。
14)URIEncoding:URL編碼字符集。
Connector 還有很多其他引數,可以參考Tomcat官網,這裡只介紹與效能相關的部分。