1. 程式人生 > >Tomcat記錄-tomcat常用配置詳解和優化方法(轉載)

Tomcat記錄-tomcat常用配置詳解和優化方法(轉載)

常用配置詳解

 1 目錄結構
 /bin:指令碼檔案目錄。
 /common/lib:存放所有web專案都可以訪問的公共jar包(使用Common類載入器載入)。
 /conf:存放配置檔案,最重要的是server.xml。
 /logs:存放日誌檔案。
 /server/webapps:來管理Tomcat-web服務用的。僅對TOMCAT可見,對所有的WEB APP都不可見(使用Catalina類載入器載入)。
 /shared/lib:僅對所有WEB APP可見,對TOMCAT不可見(使用Shared類載入器載入)。
 /temp:Tomcat執行時候存放臨時檔案用的。


 /webapps:web應用釋出目錄。
 /work:Tomcat把各種由jsp生成的servlet檔案放在這個目錄下。刪除後,啟動時會自動建立。
 
 2 配置檔案
 server.xml:主要的配置檔案。
 web.xml:預設的web app配置,WEB-INF/web.xml會覆蓋該配置。
 context.xml:不清楚跟server.xml裡面的context是否有關係。
 
 server.xml配置
 server標籤
 port:指定一個埠,這個埠負責監聽關閉tomcat的請求。
 shutdown:指定向埠傳送的命令字串。

 
 service標籤
 name:指定service的名字。
 
 Connector(表示客戶端和service之間的連線)標籤

 port:指定伺服器端要建立的埠號,並在這個埠監聽來自客戶端的請求。
 minProcessors:伺服器啟動時建立的處理請求的執行緒數。
 maxProcessors:最大可以建立的處理請求的執行緒數。
 enableLookups:如果為true,則可以通過呼叫request.getRemoteHost()進行DNS查詢來得到遠端客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址。


 redirectPort:指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號。
 acceptCount:指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理。
 connectionTimeout:指定超時的時間數(以毫秒為單位)。
 
 Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求)標籤
 defaultHost:指定預設的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的。
 
 Context(表示一個web應用程式,通常為WAR檔案,關於WAR的具體資訊見servlet規範)標籤
 docBase:該web應用的文件基準目錄(Document Base,也稱為Context Root),或者是WAR檔案的路徑。可以使用絕對路徑,也可以使用相對於context所屬的Host的appBase路徑。
 path:表示此web應用程式的url的字首,這樣請求的url為http://localhost:8080/path/****。
 reloadable:這個屬性非常重要,如果為true,則tomcat會自動檢測應用程式的/WEB-INF/lib和/WEB-INF/classes目錄的變化,自動裝載新的應用程式,我們可以在不重起tomcat的情況下改變應用程式。
 useNaming:如果希望Catalina為該web應用使能一個JNDI InitialContext物件,設為true。該InitialialContext符合J2EE平臺的約定,預設值為true。
 workDir:Context提供的臨時目錄的路徑,用於servlet的臨時讀/寫。利用javax.servlet.context.tempdir屬性,servlet可以訪問該目錄。如果沒有指定,使用$CATALINA_HOME/work下一個合適的目錄。
 swallowOutput:如果該值為true,System.out和System.err的輸出被重定向到web應用的logger。如果沒有指定,預設值為false
 debug:與這個Engine關聯的Logger記錄的除錯資訊的詳細程度。數字越大,輸出越詳細。如果沒有指定,預設為0。
 
 host(表示一個虛擬主機)標籤
 name:指定主機名。
 appBase:應用程式基本目錄,即存放應用程式的目錄。
 unpackWARs:如果為true,則tomcat會自動將WAR檔案解壓,否則不解壓,直接從WAR檔案中執行應用程式。
 
 Logger(表示日誌,除錯和錯誤資訊)標籤
 className:指定logger使用的類名,此類必須實現org.apache.catalina.Logger介面。
 prefix:指定log檔案的字首。
 suffix:指定log檔案的字尾。
 timestamp:如果為true,則log檔名中要加入時間,如下例:localhost_log.2001-10-04.txt。
 
 Realm(表示存放使用者名稱,密碼及role的資料庫)標籤
 className:指定Realm使用的類名,此類必須實現org.apache.catalina.Realm介面。
 
 Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger  中的一樣)標籤
 className:指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程式的訪問資訊。
 directory:指定log檔案存放的位置。
 pattern:有兩個值,common方式記錄遠端主機名或ip地址,使用者名稱,日期,第一行請求的字串,HTTP響應程式碼,傳送的位元組數。combined方式比common方式記錄的值更多。
 
 3 配置虛擬目錄
 1)直接部署到webapps目錄下面訪問。
 2)修改conf/server.xml檔案。在<Host name="localhost" appBase="webapps" unpackWARs="true" xmlValidation="false" xmlNamespaceAware="false"></host>中加入<Context path="/test" docBase="webdemo" debug="0" reloadable="true" />。docBase目錄預設使用appBase="webapps"這個目錄。也可以是絕對路徑。
配置主目錄,可以將path=""。
 3)當專案沒有放在webapps目錄下時,可以在conf/Catalina/localhost新建一個XXX.XML檔案。裡面加入<Context docBase="E:webdemo" debug="0" reloadable="true" />。
 注意:這裡的path屬性不需要設定,設定了也不會起作用的。
 也可以使用該方法建立主目錄指向另一個目錄,例如:<Context docBase="E:webdemo" debug="0" reloadable="true" />命名為ROOT.xml,這樣預設訪問的主目錄就被修改過了。
 
 4 配置連線數
 maxThreads:Tomcat使用執行緒來處理接收的每個請求。這個值表示Tomcat可建立的最大的執行緒數。
 acceptCount:指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理。
 minSpareThreads:Tomcat初始化時建立的執行緒數。
 maxSpareThreads:一旦建立的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒。
 enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設定為false
 connectionTimeout:網路連線超時,單位:毫秒。設定為0表示永不超時,這樣設定有隱患的。預設可設定為20000毫秒。
 
 web server允許的最大連線數還受制於作業系統的核心引數設定,通常Windows是2000個左右,Linux是1000個左右。
 
 5 配置記憶體大小
 修改bin/catalina.bat中的set CATALINA_OPTS=-Xms64m -Xmx128m。
 Xms指最小記憶體,Xmx指最大記憶體。
 
 6 安全配置
 1)將<Server port="8005" shutdown="SHUTDOWN">SHUTDOWN修改為其他一些字串。否則就容易被人給停止掉了。
 
 2)對應tomcat3.1中,遮蔽目錄檔案自動列出
 修改conf/web.xml中的
    <servlet>
         <servlet-name>default</servlet-name>
         <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
         <init-param>
             <param-name>debug</param-name>
             <param-value>0</param-value>
         </init-param>
         <init-param>
             <param-name>listings</param-name>
             <param-value>true</param-value><!-- 改成false -->
         </init-param>
         <load-on-startup>1</load-on-startup>
     </servlet>
 
 3)訪問日誌設定
 在server.xml中加入
 <Valve className="org.apache.catalina.valves.AccessLogValve"
                  directory="logs"  prefix="localhost_access_log." suffix=".txt"
                  pattern="common" resolveHosts="false"/>
 這樣訪問日誌會記錄到Logs中。
 
 4)修改使用者名稱、密碼
 conf/tomcat-users.xml
 
 5)遮蔽後臺管理入口
 方法一:從控制使用者和許可權著手。廢掉要管理許可權的使用者就可以了。
 方法二:將conf/Catalina/localhost/manager.xml改名。
 
 6)配置403,404,500錯誤頁面
 預設情況下,報出HTTP錯誤的時候會暴露tomcat版本號。如果不想暴露的話,就需要重新定義錯誤跳轉頁面。
 <error-page>
  <error-code>401</error-code>
  <location>/401.jsp</location>
 </error-page>
 <error-page>
  <error-code>404</error-code>
  <location>/404.jsp</location>
 </error-page>
 <error-page>
  <error-code>500</error-code>
  <location>/500.jsp</location>
 </error-page>
 
 注意:在測試的時候碰到一個奇怪的現象,平時專案裡面的時候測試正常的。可是今天在tomcat目錄裡面新建一個測試目錄測試並不能跳轉到指定錯誤頁面。暫時不知道為什麼。
 
 7 配置Log4j日誌記錄
 專案中丟擲的異常,拋到tomcat中的異常會被tomcat記錄下來,存放至logs/localhost.yyyy-MM-dd.log檔案中。
 平時我們在專案中使用的log4j記錄日誌跟tomcat是沒有任何關係的,是獨立的一個程式,記錄的檔案是自定義的。
 我們可以在tomcat中定義一個log4j的公共日誌處理方式,這樣在專案中就不需要在定義log4j的配置了。
 1)將log4j-1.2.15.jar加入到commonlib目錄。
 2)將log4j.properties加入到commonclasses目錄。
 內容例如:
 # Output pattern : date [thread] priority category - message
 log4j.rootLogger=DEUBG, stdout, logfile
 
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
 
 log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
 log4j.appender.logfile.File=${catalina.home}/logs/tomcat_app.log
 log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
 log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
 
 #3rd party library level
 log4j.logger.org.hibernate.cache=ERROR
 
 注意:我們專案中使用e.printStackTrace();輸出的異常會在控制檯輸出來,但是,不會記錄到tomcat日誌中。
 而且,也不會記錄到log4j的日誌中。要想記錄到log4j日誌中,必須使用log4j輸出來。
 所以,實際上web專案中進行異常處理應該將e.printStackTrace();寫寫法多改成log4j的形式才對!
 但是,實際專案中很多專案多偷懶使用了e.printStackTrace();方式輸出異常。當出現異常的時候在控制檯上檢視一下就可以了,也不考慮實際執行時候的維護。假如有人不小心關了控制檯,那麼,你不就看不到異常了嗎?
 個人介意使用log4j的形式記入web異常!
 
 8 Tomcat5亂碼問題
 Tomcat5跟Tomcat4對引數處理是不一樣的,在Tomcat4中get與post的編碼是一樣的,所以只要在過濾器中通過request.setCharacterEncoding()設定一次就可以解決get與set的問題。然而,在Tomcat5中,get與post的處理是分開的,對get請求使用URIEncoding進行處理,對post使用request.setCharacterEncoding()處理。Tomcat5中,在server.xml的Connector元素增加了以下配置引數:
 URIEncoding:用來設定通過URI傳遞的

 

 

tomcat優化配置引數

優化記憶體,主要是在bin/catalina.bat/sh 配置檔案中進行。linux上,在catalina.sh中新增:

JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M"

其中:

• -server:啟用jdk的server版本。
• -Xms:虛擬機器初始化時的最小堆記憶體。
• -Xmx:虛擬機器可使用的最大堆記憶體。 #-Xms與-Xmx設成一樣的值,避免JVM因為頻繁的GC導致效能大起大落
• -XX:PermSize:設定非堆記憶體初始值,預設是實體記憶體的1/64。
• -XX:MaxNewSize:新生代佔整個堆記憶體的最大值。
• -XX:MaxPermSize:Perm(俗稱方法區)佔整個堆記憶體的最大值,也稱記憶體最大永久保留區域。

1)錯誤提示:java.lang.OutOfMemoryError:Java heap space

Tomcat預設可以使用的記憶體為128MB,在較大型的應用專案中,這點記憶體是不夠的,有可能導致系統無法執行。常見的問題是報Tomcat記憶體溢位錯誤,Outof Memory(系統記憶體不足)的異常,從而導致客戶端顯示500錯誤,一般調整Tomcat的-Xms和-Xmx即可解決問題,通常將-Xms和-Xmx設定成一樣,堆的最大值設定為物理可用記憶體的最大值的80%。

set JAVA_OPTS=-Xms512m-Xmx512m

2)錯誤提示:java.lang.OutOfMemoryError: PermGenspace

PermGenspace的全稱是Permanent Generationspace,是指記憶體的永久儲存區域,這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Loader時就會被放到PermGenspace中,它和存放類例項(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程式執行期對PermGenspace進行清理,所以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web伺服器對JSP進行precompile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm預設的大小(4M)那麼就會產生此錯誤資訊了。解決方法:

setJAVA_OPTS=-XX:PermSize=128M

3)在使用-Xms和-Xmx調整tomcat的堆大小時,還需要考慮垃圾回收機制。如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過3-5 秒。如果垃圾收整合為瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究垃圾收集引數對效能的影響。一般說來,你應該使用實體記憶體的 80% 作為堆大小。當增加處理器時,記得增加記憶體,因為分配可以並行進行,而垃圾收集不是並行的。

2、連線數優化:

#優化連線數,主要是在conf/server.xml配置檔案中進行修改。

2.1、優化執行緒數

找到Connector port="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount屬性(使acceptCount大於等於maxThreads),如下:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />

其中:

• maxThreads:tomcat可用於請求處理的最大執行緒數,預設是200
• minSpareThreads:tomcat初始執行緒數,即最小空閒執行緒數
• maxSpareThreads:tomcat最大空閒執行緒數,超過的會被關閉
• acceptCount:當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理.預設100
2.2、使用執行緒池

在server.xml中增加executor節點,然後配置connector的executor屬性,如下:

<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>

其中:

• namePrefix:執行緒池中執行緒的命名字首
• maxThreads:執行緒池的最大執行緒數
• minSpareThreads:執行緒池的最小空閒執行緒數
• maxIdleTime:超過最小空閒執行緒數時,多的執行緒會等待這個時間長度,然後關閉
• threadPriority:執行緒優先順序

注:當tomcat併發使用者量大的時候,單個jvm程序確實可能開啟過多的檔案控制代碼,這時會報java.net.SocketException:Too many open files錯誤。可使用下面步驟檢查:

• ps -ef |grep tomcat 檢視tomcat的程序ID,記錄ID號,假設程序ID為10001
• lsof -p 10001|wc -l 檢視當前程序id為10001的 檔案運算元
• 使用命令:ulimit -a 檢視每個使用者允許開啟的最大檔案數
3、Tomcat Connector三種執行模式(BIO, NIO, APR) 3.1、三種模式比較:

1)BIO:一個執行緒處理一個請求。缺點:併發量高時,執行緒數較多,浪費資源。Tomcat7或以下在Linux系統中預設使用這種方式。

2)NIO:利用Java的非同步IO處理,可以通過少量的執行緒處理大量的請求。Tomcat8在Linux系統中預設使用這種方式。Tomcat7必須修改Connector配置來啟動(conf/server.xml配置檔案):

<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>

3)APR(Apache Portable Runtime):從作業系統層面解決io阻塞問題。Linux如果安裝了apr和native,Tomcat直接啟動就支援apr。

3.2、apr模式

安裝apr以及tomcat-native

yum -y install apr apr-devel

進入tomcat/bin目錄,比如:

cd /opt/local/tomcat/bin/
tar xzfv tomcat-native.tar.gz
cd tomcat-native-1.1.32-src/jni/native
./configure --with-apr=/usr/bin/apr-1-config
make && make install

#注意最新版本的tomcat自帶tomcat-native.war.gz,不過其版本相對於yum安裝的apr過高,configure的時候會報錯。

解決:yum remove apr apr-devel –y,解除安裝yum安裝的apr和apr-devel,下載最新版本的apr原始碼包,編譯安裝;或者下載低版本的tomcat-native編譯安裝

安裝成功後還需要對tomcat設定環境變數,方法是在catalina.sh檔案中增加1行:

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"

#apr下載地址:http://apr.apache.org/download.cgi

#tomcat-native下載地址:http://tomcat.apache.org/download-native.cgi

修改8080端對應的conf/server.xml

protocol="org.apache.coyote.http11.Http11AprProtocol"

<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
enableLookups="false"
redirectPort="8443"
URIEncoding="UTF-8" />

PS:啟動以後檢視日誌 顯示如下表示開啟 apr 模式

Sep 19, 2016 3:46:21 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8081"]

tomcat常見面試題

一、Tomcat的預設是多少,怎麼修改

Tomcat的預設埠號是8080.修改Tomcat埠號:

1.找到Tomcat目錄下的conf資料夾

2.進入conf資料夾裡面找到server.xml檔案

3.開啟server.xml檔案

4.在server.xml檔案裡面找到下列資訊

maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″ enableLookups=”false” redirectPort=”8443″ acceptCount=”100″ connectionTimeout=”20000″ disableUploadTimeout=”true” />

5.把port=”8080″改成port=”8888″,並且儲存

6.啟動Tomcat,並且在IE瀏覽器裡面的位址列輸入http://127.0.0.1:8888/

7、tomcat預設採用的BIO模型,在幾百併發下效能會有很嚴重的下降。tomcat自帶還有NIO的模型,另外也可以呼叫APR的庫來實現作業系統級別控制。NIO模型是內建的,呼叫很方便,只需要將上面配置檔案中protocol修改成 org.apache.coyote.http11.Http11NioProtocol,重啟即可生效。如下面的引數配置,預設的是HTTP/1.1。

<Connector port=”8080″ protocol=”org.apache.coyote.http11.Http11NioProtocol” connectionTimeout=”20000″ redirectPort=”8443″ maxThreads=”500″ minSpareThreads=”20″ acceptCount=”100″ disableUploadTimeout=”true”

enableLookups=”false” URIEncoding=”UTF-8″ />

二、tomcat 如何優化?

1、優化連線配置.這裡以tomcat7的引數配置為例,需要修改conf/server.xml檔案,修改連線數,關閉客戶端dns查詢。

引數解釋:

URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的檔案的url,真方便,不像apache裡還有搞個mod_encoding,還要手工編譯

maxSpareThreads : 如果空閒狀態的執行緒數多於設定的數目,則將這些執行緒中止,減少這個池中的執行緒總數。

minSpareThreads : 最小備用執行緒數,tomcat啟動時的初始化的執行緒數。

enableLookups : 這個功效和Apache中的HostnameLookups一樣,設為關閉。

connectionTimeout : connectionTimeout為網路連線超時時間毫秒數。

maxThreads : maxThreads Tomcat使用執行緒來處理接收的每個請求。這個值表示Tomcat可建立的最大的執行緒數,即最大併發數。

acceptCount : acceptCount是當執行緒數達到maxThreads後,後續請求會被放入一個等待佇列,這個acceptCount是這個佇列的大小,如果這個佇列也滿了,就直接refuse connection

maxProcessors與minProcessors : 在 Java中執行緒是程式執行時的路徑,是在一個程式中與其它控制執行緒無關的、能夠獨立執行的程式碼段。它們共享相同的地址空間。多執行緒幫助程式設計師寫出CPU最 大利用率的高效程式,使空閒時間保持最低,從而接受更多的請求。

通常Windows是1000個左右,Linux是2000個左右。

useURIValidationHack:

我們來看一下tomcat中的一段原始碼:

【security】

if (connector.getUseURIValidationHack()) {

String uri = validate(request.getRequestURI());

if (uri == null) {

res.setStatus(400);

res.setMessage(“Invalid URI”);

throw new IOException(“Invalid URI”);

} else {

req.requestURI().setString(uri);

// Redoing the URI decoding

req.decodedURI().duplicate(req.requestURI());

req.getURLDecoder().convert(req.decodedURI(), true);

可以看到如果把useURIValidationHack設成”false”,可以減少它對一些url的不必要的檢查從而減省開銷。

enableLookups=”false” : 為了消除DNS查詢對效能的影響我們可以關閉DNS查詢,方式是修改server.xml檔案中的enableLookups引數值。

disableUploadTimeout :類似於Apache中的keeyalive一樣

給Tomcat配置gzip壓縮(HTTP壓縮)功能

compression=”on” compressionMinSize=”2048″ compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求網頁後,從伺服器端將網頁檔案壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節省40%左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人。

1)compression=”on” 開啟壓縮功能

2)compressionMinSize=”2048″ 啟用壓縮的輸出內容大小,這裡面預設為2KB

3)noCompressionUserAgents=”gozilla, traviata” 對於以下的瀏覽器,不啟用壓縮

4)compressableMimeType=”text/html,text/xml” 壓縮型別

最後不要忘了把8443埠的地方也加上同樣的配置,因為如果我們走https協議的話,我們將會用到8443埠這個段的配置,對吧?{

tomcat設定https埠時,8443和443區別:
1. 8443埠在訪問時需要加埠號,相當於http的8080,不可通過域名直接訪問,需要加上埠號;https://yuming.com:8443。

2. 443埠在訪問時不需要加埠號,相當於http的80,可通過域名直接訪問;例:https://yuming.com。

*問:https使用域名訪問網站,而不顯示埠號?

 答:將埠號設定為443,即可通過域名直接訪問網站

<!–enable tomcat ssl–>

<Connector port=”8443″ protocol=”HTTP/1.1″ URIEncoding=”UTF-8″ minSpareThreads=”25″ maxSpareThreads=”75″ enableLookups=”false” disableUploadTimeout=”true” connectionTimeout=”20000″ acceptCount=”300″ maxThreads=”300″ maxProcessors=”1000″ minProcessors=”5″ useURIValidationHack=”false” compression=”on” compressionMinSize=”2048″ compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

SSLEnabled=”true”scheme=”https” secure=”true”clientAuth=”false” sslProtocol=”TLS”keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”/>

好了,所有的Tomcat優化的地方都加上了。

2、優化JDK

Tomcat預設可以使用的記憶體為128MB,Windows下,在檔案{tomcat_home}/bin/catalina.bat,Unix下,在檔案$CATALINA_HOME/bin/catalina.sh的前面,增加如下設定:

JAVA_OPTS=”‘$JAVA_OPTS” -Xms[初始化記憶體大小] -Xmx[可以使用的最大記憶體]

設定環境變數:export JAVA_OPTS=””$JAVA_OPTS” -Xms[初始化記憶體大小] -Xmx[可以使用的最大記憶體]”

一般說來,你應該使用實體記憶體的 80% 作為堆大小。如果本機上有Apache伺服器,可以先折算Apache需要的記憶體,然後修改堆大小。建議設定為70%;建議設定[[初始化記憶體大小]等於[可以使用的最大記憶體],這樣可以減少平凡分配堆而降低效能。

本例使用加入環境變數的方式:

# vi /etc/profile

加入:export JAVA_OPTS=””$JAVA_OPTS” -Xms700 —Xmx700

# source /etc/profile

【引數說明】

-Xms 是指設定程式啟動時佔用記憶體大小。一般來講,大點,程式會啟動的 快一點,但是也可能會導致機器暫時間變慢。

-Xmx 是指設定程式執行期間最大可佔用的記憶體大小。如果程式執行需要佔 用更多的記憶體,超出了這個設定值,就會丟擲OutOfMemory 異常。

-Xss 是指設定每個執行緒的堆疊大小。這個就要依據你的程式,看一個執行緒 大約需要佔用多少記憶體,可能會有多少執行緒同時執行等。

-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64 。

-XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。

三、tomcat 有那幾種Connector 執行模式?

tomcat的執行模式有3種.修改他們的執行模式.3種模式的執行是否成功,可以看他的啟動控制檯,或者啟動日誌.或者登入他們的預設頁面http://localhost:8080/檢視其中的伺服器狀態。

1)bio

預設的模式,效能非常低下,沒有經過任何優化處理和支援.

2)nio

利用java的非同步io護理技術,no blocking IO技術.

想執行在該模式下,直接修改server.xml裡的Connector節點,修改protocol為

<Connector port=”80″ protocol=”org.apache.coyote.http11.Http11NioProtocol” connectionTimeout=”20000″ URIEncoding=”UTF-8″ useBodyEncodingForURI=”true” enableLookups=”false” redirectPort=”8443″ />啟動後,就可以生效。

3)apr

安裝起來最困難,但是從作業系統級別來解決非同步的IO問題,大幅度的提高效能.

必須要安裝apr和native,直接啟動就支援apr。下面的修改純屬多餘,僅供大家擴充知識,但仍然需要安裝apr和native。如nio修改模式,修改protocol為org.apache.coyote.http11.Http11AprProtocol

四、tomcat調優

1. JVM引數調優:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。這兩個值的大小一般根據需要進行設定。當應用程式需要的記憶體超出堆的最大值時虛擬機器就會提示記憶體溢位,並且導致應用服務崩潰。因此一般建議堆的最大值設定為可用記憶體的最大值的80%。在catalina.bat中,設定JAVA_OPTS='-Xms256m -Xmx512m',表示初始化記憶體為256MB,可以使用的最大記憶體為512MB。 
2. 禁用DNS查詢 
 當web應用程式想要記錄客戶端的資訊時,它也會記錄客戶端的IP地址或者通過域名伺服器查詢機器名轉換為IP地址。DNS查詢需要佔用網路,並且包括可能從很多很遠的伺服器或者不起作用的伺服器上去獲取對應的IP的過程,這樣會消耗一定的時間。為了消除DNS查詢對效能的影響我們可以關閉DNS查詢,方式是修改server.xml檔案中的enableLookups引數值: 
Tomcat4 
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" /> 

Tomcat5 
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/> 
3. 調整執行緒數 
通過應用程式的聯結器(Connector)進行效能控制的的引數是建立的處理請求的執行緒數。Tomcat使用執行緒池加速響應速度來處理請求。在Java中執行緒是程式執行時的路徑,是在一個程式中與其它控制執行緒無關的、能夠獨立執行的程式碼段。它們共享相同的地址空間。多執行緒幫助程式設計師寫出CPU最大利用率的高效程式,使空閒時間保持最低,從而接受更多的請求。 
Tomcat4中可以通過修改minProcessors和maxProcessors的值來控制執行緒數。這些值在安裝後就已經設定為預設值並且是足夠使用的,但是隨著站點的擴容而改大這些值。minProcessors伺服器啟動時建立的處理請求的執行緒數應該足夠處理一個小量的負載。也就是說,如果一天內每秒僅發生5次單擊事件,並且每個請求任務處理需要1秒鐘,那麼預先設定執行緒數為5就足夠了。但在你的站點訪問量較大時就需要設定更大的執行緒數,指定為引數maxProcessors的值。maxProcessors的值也是有上限的,應防止流量不可控制(或者惡意的服務攻擊),從而導致超出了虛擬機器使用記憶體的大小。如果要加大併發連線數,應同時加大這兩個引數。web server允許的最大連線數還受制於作業系統的核心引數設定,通常Windows是2000個左右,Linux是1000個左右。 
在Tomcat5對這些引數進行了調整,請看下面屬性: 
maxThreads    Tomcat使用執行緒來處理接收的每個請求。這個值表示Tomcat可建立的最大的執行緒數。 
acceptCount    指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理。 
connnectionTimeout    網路連線超時,單位:毫秒。設定為0表示永不超時,這樣設定有隱患的。通常可設定為30000毫秒。 
minSpareThreads    Tomcat初始化時建立的執行緒數。 
maxSpareThreads     一旦建立的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒。 
最好的方式是多設定幾次並且進行測試,觀察響應時間和記憶體使用情況。在不同的機器、作業系統或虛擬機器組合的情況下可能會不同,而且並不是所有人的web站點的流量都是一樣的,因此沒有一刀切的方案來確定執行緒數的值。 

 

Tomcat作為Web伺服器,它的處理效能直接關係到使用者體驗,下面是幾種常見的優化措施:

     一、掉對web.xml的監視,把jsp提前編輯成Servlet。有富餘實體記憶體的情況,加大tomcat使用的jvm的記憶體

     二、伺服器資源
  伺服器所能提供CPU、記憶體、硬碟的效能對處理能力有決定性影響。
  (1) 對於高併發情況下會有大量的運算,那麼CPU的速度會直接影響到處理速度。
  (2) 記憶體在大量資料處理的情況下,將會有較大的記憶體容量需求,可以用-Xmx -Xms -XX:MaxPermSize等引數對記憶體不同功能塊進行劃分。我們之前就遇到過記憶體分配不足,導致虛擬機器一直處於full GC,從而導致處理能力嚴重下降。
  (3) 硬碟主要問題就是讀寫效能,當大量檔案進行讀寫時,磁碟極容易成為效能瓶頸。最好的辦法還是利用下面提到的快取。

    三、利用快取和壓縮
  對於靜態頁面最好是能夠快取起來,這樣就不必每次從磁碟上讀。這裡我們採用了Nginx作為快取伺服器,將圖片、css、js檔案都進行了快取,有效的減少了後端tomcat的訪問。
  另外,為了能加快網路傳輸速度,開啟gzip壓縮也是必不可少的。但考慮到tomcat已經需要處理很多東西了,所以把這個壓縮的工作就交給前端的Nginx來完成。
  除了文字可以用gzip壓縮,其實很多圖片也可以用影象處理工具預先進行壓縮,找到一個平衡點可以讓畫質損失很小而檔案可以減小很多。曾經我就見過一個圖片從300多kb壓縮到幾十kb,自己幾乎看不出來區別。

     四、採用叢集
  單個伺服器效能總是有限的,最好的辦法自然是實現橫向擴充套件,那麼組建tomcat叢集是有效提升效能的手段。我們還是採用了Nginx來作為請求分流的伺服器,後端多個tomcat共享session來協同工作。

     五、 優化tomcat引數
  這裡以tomcat7的引數配置為例,需要修改conf/server.xml檔案,主要是優化連線配置,關閉客戶端dns查詢。

<Connector port="8080"   
           protocol="org.apache.coyote.http11.Http11NioProtocol"  
           connectionTimeout="20000"  
           redirectPort="8443"   
           maxThreads="500"   
           minSpareThreads="20"  
           acceptCount="100" 
           disableUploadTimeout="true" 
           enableLookups="false"   
           URIEncoding="UTF-8" />