Tomcat介绍及性能优化
一、Tomcat簡單介紹:
Sun公司創建了第一個Servlet容器,即Java Web Server,但JWS只是為了演示Servlet的相應功能,所以其性能很不穩定。與此同時,apache基金會組織(ASF)創建了JServ項目,一個能夠與apache整合起來的servlet容器。1999年,Sun公司把JWS捐給了ASF,于是兩個項目合二為一,即今天Tomcat的前身。第一個tomcat版本是Tomcat 3.x系列,而發布于2001年Tomcat4.0則是在此前基礎上進行了重新設計和實現,其代碼項目被命名為Catalina。
Tomcat服務器是一個免費的開放源代碼的Web應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP程序的首選。
版本介紹:現在版本更新到 Apache Tomcat 8.x,但是Apache Tomcat 7.x是目前開發的焦點。Apache Tomcat 7.x它在汲取了Tomcat 6.0.x優點的基礎上,實現了對于Servlet 3.0、JSP 2.2和EL 2.2等特性的支持。
除此以外的改進列表如下:
· Web應用內存溢出偵測和預防
· 增強了管理程序和服務器管理程序的安全性
· 一般 CSRF保護
· 支持web應用中的外部內容的直接引用
· 重構 (connectors, lifecycle)及很多核心代碼的全面梳理
二、tomcat運行模式介紹:
Tomcat Connector(Tomcat連接器)有bio、nio、apr三種運行模式,那么這三種運行模式有什么區別呢,我們又如何修改Tomcat Connector的運行模式來提高Tomcat的運行性能呢?
bio模式:
bio(blocking I/O),顧名思義,即阻塞式I/O操作,表示Tomcat使用的是傳統的Java I/O操作(即java.io包及其子包)。Tomcat在默認情況下,就是以bio模式運行的。遺憾的是,就一般而言,bio模式是三種運行模式中性能最低的一種。我們可以通過Tomcat Manager來查看服務器的當前狀態。
[root@web?conf]#?cd?/data/node1/conf/tomcat-users.xml? [root@web?conf]#?vim?tomcat-users.xml?#添加進去兩行代碼,也就是新創建一個賬號和密碼。 <role?rolename="manager-gui"/><user?username="tomcat"?password="tomcat"?roles="manager-gui"/> 添加之后,然后保存退出此文件。想讓配置文件生效,需要重啟下tomcat。 [root@web?conf]#?/data/node1/bin/shutdown.sh? [root@web?conf]#?/data/node1/bin/startup.sh?
點擊Server Status查看下狀態:
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)更好的并發運行性能。要讓Tomcat以nio模式來運行也比較簡單,我們只需要在Tomcat安裝目錄/conf/server.xml文件中將如下配置:
<Connector?port="8080"?protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"?/> 中的protocol屬性值改為org.apache.coyote.http11.Http11NioProtocol即可: <Connector?port="8080"?protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"?/>此時,我們就可以在Tomcat Manager中看到當前服務器狀態頁面的HTTP協議的Connector運行模式已經從http-bio-8080變成了http-nio-8080。
apr模式:
apr(Apache Portable Runtime/Apache可移植運行時),是Apache HTTP服務器的支持庫。你可以簡單地理解為,Tomcat將以JNI的形式調用Apache HTTP服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,從而大大地提高Tomcat對靜態文件的處理性能。 Tomcat apr也是在Tomcat上運行高并發應用的首選模式。如果我們的Tomcat不是在apr模式下運行,在啟動Tomcat的時候,我們可以在日志信息中看到類似如下信息:
2013-8-6 16:17:49 org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: xxx/xxx(這里是路徑信息)
Tomcat apr運行模式的配置是三種運行模式之中相對比較麻煩的一種。據官方文檔所述,Tomcat apr需要以下三個組件的支持:
APR library[APR庫]
JNI wrappers for APR used by Tomcat (libtcnative)[簡單地說,如果是在Windows操作系統上,就是一個名為tcnative-1.dll的動態鏈接庫文件]
OpenSSL libraries[OpenSSL庫]
此外,與配置nio運行模式一樣,也需要將對應的Connector節點的protocol屬性值改為org.apache.coyote.http11.Http11AprProtocol。 不過,上述繁瑣的操作都是Tomcat 7.0.30之前的版本才需要這樣配置,從Tomcat 7.0.30版本開始,Tomcat已經自帶了tcnative-1.dll等文件,并且默認就是在Tomcat apr模式下運行,因此我們只需要下載最新版本的Tomcat直接使用即可。
?默認情況下是bio模式,介紹下怎么更換成apr模式:
[root@web]#yum?install?-y?apr?apr-util?apr-devel [root@web]#?cd?/data/node1/bin [root@web?bin]#?tar?-zxvf?tomcat-native.tar.gz [root@web?bin]#?cd?tomcat-native-1.1.32-src/jni/native/ [root@web?native]#?./configure?--with-apr=/usr/bin/apr-1-config?--with-ssl=/usr/include/openssl/ [root@web?native]#?make?&&?make?installtomcat和apr庫整合,需要修改shell腳本文件catalina.sh
[root@web?node1]#?vim?/data/node1/bin/catalina.sh?+99 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"?? cygwin=false darwin=false CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib" os400=false保存退出,重啟tomcat。看tomcat啟動輸出日志信息:
信息:?Deploying?web?application?directory?/data/node1/webapps/host-manager 七月?10,?2015?6:42:19?下午?org.apache.catalina.startup.HostConfig?deployDirectory 信息:?Deployment?of?web?application?directory?/data/node1/webapps/host-manager?has?finished?in?156?ms 七月?10,?2015?6:42:19?下午?org.apache.catalina.startup.HostConfig?deployDirectory 信息:?Deploying?web?application?directory?/data/node1/webapps/examples 七月?10,?2015?6:42:21?下午?org.apache.catalina.startup.HostConfig?deployDirectory 信息:?Deployment?of?web?application?directory?/data/node1/webapps/examples?has?finished?in?1,490?ms 七月?10,?2015?6:42:21?下午?org.apache.coyote.AbstractProtocol?start 信息:?Starting?ProtocolHandler?["http-apr-8080"] 七月?10,?2015?6:42:22?下午?org.apache.catalina.startup.Catalina?start 信息:?Server?startup?in?25191?ms 出現了["http-apr-8080"]字段,說明現在tomcat已經是apr模式。三、下面介紹一下搭建tomcat服務器,所需的jdk環境變量:
Tomcat7.x服務器搭建,請大家參看:http://taokey.blog.51cto.com/4633273/1615551
jdk環境變量詳解: JAVA_HOME=/data/jdk1.7.0_71???????????????#JAVA_HOME環境變量,它是指向jdk的安裝目錄的絕對路徑,當JDK路徑改變的時候,僅需更改JAVA_HOME的變量值即可。 JRE_HOME=/data/jdk1.7.0_71/jre????????????#GRE_HOME環境變量,它是指向jre的安裝目錄的絕對路徑。 PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin???#?PATH環境變量。作用是指定命令搜索路徑,在shell下面執行命令時,它會到PATH變量所指定的路徑中查找看是否能找到相應的命令程序。我們需要把?jdk安裝目錄下的bin目錄增加到現有的PATH變量中,bin目錄中包含經常要用到的可執行文件如javac/java/javadoc等待,設置好?PATH變量后,就可以在任何目錄下執行javac/java等工具了。? CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib????#CLASSPATH環境變量。作用是指定類搜索路徑,要使用已經編寫好的類,前提當然是能夠找到它們了,JVM就是通過CLASSPTH來尋找類的。我們?需要把jdk安裝目錄下的lib子目錄中的dt.jar和tools.jar設置到CLASSPATH中,當然,當前目錄“.”也必須加入到該變量中。? export?JAVA_HOME?JRE_HOME?PATH?CLASSPATH? export?PATH=$PATH:JAVA_HOME/bin export?JAVA_HOME四、Tomcat安全和性能優化。
安全優化,關閉服務器端口,修改默認的端口。
1).默認tomcat端口號是8080,最好修改一下,配置文件在server.xml中。
server.xml默認有下面一行:
<Server port="8005" shutdown="SHUTDOWN">
這樣允許任何人只要telnet到服務器的8005端口,輸入"SHUTDOWN",然后回車,服務器立即就被關掉了。從安全的角度上考慮,我們需要把這個shutdown指令改成一個別人不容易猜測的字符串,可以同時把端口也改了。
2).8009端口是tomcat和apache的mod_proxy_ajp,mod_jk溝通的端口,沒用到就關了。在tomcat的配置文件server.xml中這段注釋掉:
<!--
? ? <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
? ? -->
2.tomcat性能方面的優化:
1).1.優化catalina.sh配置文件。在catalina.sh配置文件中添加以下代碼:
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"
server:一定要作為第一個參數,在多個CPU時性能佳
-Xms:初始Heap大小,使用的最小內存,cpu性能高時此值應設的大一些
-Xmx:java heap最大值,使用的最大內存
上面兩個值是分配JVM的最小和最大內存,取決于硬件物理內存的大小,建議均設為物理內存的一半。
-XX:PermSize:設定內存的永久保存區域
-XX:MaxPermSize:設定最大內存的永久保存區域
-XX:MaxNewSize:
-Xss 15120 這使得JBoss每增加一個線程(thread)就會立即消耗15M內存,而最佳值應該是128K,默認值好像是512k.
+XX:AggressiveHeap 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個G的swap。
-Xss:每個線程的Stack大小
-verbose:gc 現實垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般設置為Xmx的3、4分之一
-XX:+UseParNewGC :縮短minor收集的時間
-XX:+UseConcMarkSweepGC :縮短major收集的時間
關于JVM內存配置這里推薦幾篇文章大家可以看下:
http://blog.chinaunix.net/uid-743704-id-2681326.html
http://www.open-open.com/lib/view/open1324736648468.html
***linux/tomcatnacunxiangjie__zhuanzaibufennarong_523821_1373809710.html
2).優化tomcat服務器中的server.xml配置文件,在配置文件中找到Connector port="8080",然后做如下修改:
<Connector?port="8080"?protocol="org.apache.coyote.http11.Http11AprProtocol"connectionTimeout="20000"redirectPort="8443"?enableLookups="false"acceptCount="50"minProcessors="20"maxProcessors="200"?maxThreads="400"minSpareThreads="25"maxSpareThreads="75"URIEncoding="utf-8"?/>參數詳解:
connnectionTimeout: 網絡連接超時,默認值20000,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為30000毫秒。(本系統由于與后臺系統接口超時時間較長,使用設置為60000)?
redirectPort: 如果Connector支持非SSL請求,在收到一個要求使用SSL傳輸的請求以后,Catalina會自動將該請求重定向到這里指定的端口號。
enableLookups: 是否反查域名,默認值為true。為了提高處理能力,應設置為false?
acceptCount: 指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。默認值10。
minProcessors:最小空閑連接線程數,用于提高系統處理性能,默認值為10
maxProcessors:最大連接線程數,即:并發處理的最大請求數,默認值為75
maxThreads: Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。默認值200。 可以根據機器的時期性能和內存大小調整,一般可以在400-500。最大可以在800左右。 ?
minSpareThreads: Tomcat初始化時創建的線程數。默認值4。?
maxSpareThreads: 一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。默認值50。?
URIEncoding: URI編碼用于解碼字節字符的格式,顯示中文,使用UTF-8即可。
3).編寫tomcat重啟腳本,加入開機自啟動。
more?/etc/init.d/tomcat #!/bin/bash#?chkconfig:?-?96?14#?description:?Tht?Apache?Tomcat?Servlet/JSP?container.#export?JAVA_HOME=/data/jdk1.7.0_71export?CATALINA_HOME=/data/tomcatexec?/data/tomcat/bin/catalina.sh?$* chmod?o+x?/etc/init.d/tomcat chkconfig?--add?tomcat chkconfig?node1?on chkconfig?--list?node1? node1???????????0:off???1:off???2:on????3:on????4:on????5:on????6:off五,Tomcat日志分割。
1.下載并安裝cronolog軟件。
cd?/taokey/tools/ tar?-zxf?cronolog-1.6.2.tar.gz cd?cronolog-1.6.2/ ./configure make?&&?make?install which?cronolog? /usr/local/sbin/cronolog2.修改tomcat的catalina.sh文件。
cd?/data/node1/bin/ vim?catalina.sh?+373 touch?"$CATALINA_OUT"找到這行,注釋掉,應該是在373行附近,
#touch "$CATALINA_OUT"
然后找到這兩行,
org.apache.catalina.startup.Bootstrap?"$@"?start?\ >>?"$CATALINA_OUT"?2>&1?"&"修改成:
org.apache.catalina.startup.Bootstrap?"$@"?start?2>&1?| /usr/local/sbin/cronolog?"$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out?>>?/dev/null?&3.重啟tomcat服務,查看生成的日志。
/etc/init.d/tomcat?stop ps?-ef?|?grep?java /etc/init.d/tomcat?start tail?-f?/data/node1/logs/catalina.2015-10-26.out Oct?26,?2015?2:19:47?PM?org.apache.catalina.startup.HostConfig?deployDirectory INFO:?Deploying?web?application?directory?/data/node1 Oct?26,?2015?2:19:47?PM?org.apache.catalina.startup.HostConfig?deployDirectory INFO:?Deployment?of?web?application?directory?/data/node1?has?finished?in?143?ms Oct?26,?2015?2:19:47?PM?org.apache.coyote.AbstractProtocol?start INFO:?Starting?ProtocolHandler?["http-bio-8080"] Oct?26,?2015?2:19:47?PM?org.apache.coyote.AbstractProtocol?start INFO:?Starting?ProtocolHandler?["ajp-bio-8009"] Oct?26,?2015?2:19:47?PM?org.apache.catalina.startup.Catalina?start INFO:?Server?startup?in?1700?ms這樣就把catalina.out的日志按天分割了。今天是10月26就是catalina.2015-10-26.out,10月27日就是
catalina.2015-10-27.out,這樣查找日志的時候,很方便快捷。
總結
以上是生活随笔為你收集整理的Tomcat介绍及性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cordova探险系列(一个)
- 下一篇: 我的Android进阶之旅------g