作為運維,避免不了與tomcat打交道,然而作者發(fā)現(xiàn)網(wǎng)絡上關(guān)于tomcat配置和調(diào)優(yōu)安全的文章非常散,通過參考各位大神的相關(guān)技術(shù)文檔,根據(jù)作者對tomcat的運維經(jīng)驗,總結(jié)了一些tomcat的基礎(chǔ)運維注意事項,希望對廣大技術(shù)兄弟們有些幫助。
本篇文章只是對tomcat模板的基礎(chǔ)調(diào)優(yōu),除了部署tomcat的各系統(tǒng)環(huán)境和配置,影響tomcat并發(fā)和性能的另一大重要因素,就是java的代碼工程,而如何在生產(chǎn)中優(yōu)化java工程,這個就需要運維與開發(fā)共同配合,尤其是運維需要有開發(fā)與運維是同一個團隊的意識,只有雙方配合默契才能發(fā)揮最大戰(zhàn)力,要知道一個人的力量永遠是有限的,只有團隊合作才能爆發(fā)出真正力量!
而包含了Java工程的整體優(yōu)化就設計到整體的架構(gòu)優(yōu)化,這個更加是一個細致而有趣的過程,也是運維通向架構(gòu)師的一個必經(jīng)之路!
1功能優(yōu)化
1.1硬件資源對tomcat的影響
作者實測,在阿里云的不同區(qū)域部署相同系統(tǒng)應用配置的tomcat,在壓測時會出現(xiàn)吞吐量差異達到1/4,經(jīng)過對比發(fā)現(xiàn),兩個區(qū)域的cpu頻率2.2GHz和2.6Ghz。系統(tǒng)硬件性能直接影響tomcat的并發(fā)量,起決定作用的是CPU和MEM,CPU運行速度提升,會帶來tomcat響應時間的縮短,mem大小決定工程需要內(nèi)存的大小和工程的并發(fā)數(shù)量。
1.2Java虛擬機調(diào)優(yōu)
1.2.1JDK版本選擇
如果新手請選擇SUN的JVM,在滿足項目需要的前提下,盡量選用版本較高的JVM,一般來說高版本產(chǎn)品在速度和效率上比低版本會有改進。JDK1.4比JDK1.3性能提高了近10%-20%,JDK1.5比JDK1.4性能提高25%-75%。因此對性能要求較高的情況推薦使用JDK1.6。
這里需要補充的是,各位在打算升級JVM時,一定要先讓開發(fā)先試用高版本的JVM,調(diào)試高版本JVM對工程的影響,經(jīng)過測試后逐步部署到測試環(huán)境,經(jīng)過一定時間的驗證,發(fā)現(xiàn)沒有問題后再謹慎的更換到生產(chǎn)。JVM版本不一致,很容易出現(xiàn)各類異常,對待生產(chǎn),謹慎永遠是第一原則!
JVM調(diào)優(yōu)參見:http://vekergu.blog.51cto.com/9966832/1626733
1.2.2JDK參數(shù)優(yōu)化
Tomcat內(nèi)存優(yōu)化主要是對tomcat啟動參數(shù)優(yōu)化,我們可以在tomcat的啟動腳本catalina.sh中設置JAVA_OPTS參數(shù)。
1.JAVA_OPTS參數(shù)說明
-server?啟用jdk?的?server?版;
-Xms???java虛擬機初始化時的最小內(nèi)存;
-Xmx??java虛擬機可使用的最大內(nèi)存;
-XX:PermSize????內(nèi)存永久保留區(qū)域
-XX:MaxPermSize???內(nèi)存最大永久保留區(qū)域
-Xms=-Xmx=服務器內(nèi)存*70%,如部署tomcat,jboss在同一臺服務器-Xms=-Xmx=服務器內(nèi)存*80%*1/4,現(xiàn)公司服務器內(nèi)存一般都可以加到最大4G,所以可以采取以下配置,把以下參數(shù)添加到catalina.sh里面,
JAVA_OPTS='-Xms1024m?-Xmx4096m?-XX:PermSize=256M?-XX:MaxNewSize=256m-XX:MaxPermSize=256m'
#-Xmx6000m????????????????????????:設置JVM最大可用內(nèi)存為6000MB
#-Xms6000m????????????????????????:設置JVM初始可用內(nèi)存為6000MB
#-Xmn2g??????????????????????????????:設置年輕代大小為2G
#-Xss128k?????????????????????????????:設置每個線程的堆棧大小為128k
#-XX:NewRatio=4?????????????????:設置年輕代與年老代的比值為4
#-XX:SurvivorRatio=4????????????:設置年輕代中Eden區(qū)與Survivor區(qū)的大小比值為4
#-XX:PermSize=512m????????????????????:設置堆棧永久區(qū)起始大小為512m
#-XX:MaxPermSize=512m?????????????:設置堆棧永久區(qū)最大大小為512m
#-XX:MaxTenuringThreshold=0?????:設置垃圾最大年齡為0
#-XX:+UseParallelGC?????????????????????:選擇垃圾收集器為并行收集器
#-XX:ParallelGCThreads=8?????????????:配置并行收集器的線程數(shù)
#-XX:+UseParallelOldGC????????????????:配置年老代垃圾收集方式為并行收集
#-XX:+UseAdaptiveSizePolicy?????:并行收集器會自動選擇年輕代區(qū)大小和相應的Survivor區(qū)比例,以達到目標系統(tǒng)規(guī)定的最低響應時>間或者收集頻率等,此值建議使用并行收集器時,一直打開。
1.2.3生產(chǎn)案例
根據(jù)作者本人的經(jīng)驗,生產(chǎn)環(huán)境需要確定對JVM的設置,還是需要根據(jù)java的運行狀態(tài),通過監(jiān)控后,不斷的調(diào)試的一個過程,沒有那個配置一上來就可以適應所有的場景。以下就舉列作者常用的一個JVM配置方式:
JAVA_OPTS="
-server
-Xms1024m
-Xmx1024m
-Xmn384m
-XX:PermSize=64m
-XX:MaxPermSize=128m
-XX:+UseParallelOldGC
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:/opt/tomcat/log/gc.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/tomcat/heap.bin"
說明:
1.Xms與Xmx普遍選擇配置相同的大小,實際大小根據(jù)實際情況調(diào)整,由小向大增加,沒必要一開始就增加到很大的內(nèi)存。
2.XX:PermSize設置堆棧永久區(qū)起始大小,XX:MaxPermSize設置堆棧永久區(qū)最大大,其實設置比默認值大寫即可,或者默認也可以。作者這個這兩個值,是因為出現(xiàn)過永久區(qū)內(nèi)存溢出,才進行設定的。
3.UseParallelOldGC、PrintGCDateStamps、PrintGCDetails、Xloggc:/opt/tomcat/log/gc.log設置GClog日志,這個對分析tomcat中JVM內(nèi)存使用情況非常有效。
4.XX:+HeapDumpOnOutOfMemoryError、XX:HeapDumpPath=/opt/tomcat/heap.bin"設置內(nèi)存溢出時,輸出HeapDump,具體如何使用分析HeapDump文件,請參考:http://vekergu.blog.51cto.com/9966832/1619640
5.作者對JVM參數(shù)設置的做法,調(diào)整合適的JVM內(nèi)存大小,開啟GClog和HeapDump即可。
1.3tomcat集群之session共享
1.3.1基于tomcat集群的session共享
在{TOMCST_HOME}/conf/server.xml取消下面代碼注釋即可:
1
1.3.2基于memcached存儲session共享
具體配置方法見:http://vekergu.blog.51cto.com/9966832/1672833
1.4站點的默認網(wǎng)頁、自定義錯誤頁面、禁止列目錄等功能
這些功能開發(fā)會在工程的WEB-INF目錄下的web.xml中設置,運維了解下就好,者遇到類似問題可以找到解決思路。
1.4.1默認主頁
1.4.2自定義錯誤頁面
1.4.3定義會話超時時間
1.4.4禁止列目錄
1.5管理AJP端口
AJP是為Tomcat與HTTP服務器之間通信而定制的協(xié)議,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個連接器。由于我們公司前端是由nginx做的反向代理,因此不使用此連接器,因此需要注銷掉該連接器。在{TOMCST_HOME}/conf/server.xml中找到下列代碼,注釋即可
1.6取消默認gc監(jiān)聽
如果開啟了GClog,再開啟GC監(jiān)聽,會影響GClog輸出,功能重復,可以選擇取消。
1.7自定義tomcat代碼路徑(2015-7-21新增)
其中:
docBase這個是你代碼的路徑
path這個是你訪問網(wǎng)站的URL路徑,要區(qū)別path的意義,請看下面的舉例
舉例:
訪問www.aaa.com
訪問www.aaa.com/code_file
reloadable如果為true,會自動加載變化的動態(tài)文件,看起來挺智能的,但是,在tomcat加載變化代碼的時候有可能會出現(xiàn)內(nèi)存溢出,tomcat服務不正常等異常,建議還是false掉,更新完代碼腳本重啟tomcat才是王道。
此前看到一些文章,在講解自定義tomcat代碼路徑時,reloadable全部是true,可能能多小伙伴都設置為true,建議對這個參數(shù)認真對待,否則一不小心就是一個坑。。。。
2性能優(yōu)化
2.1屏蔽DNS查詢
Web應用程序可以通過Web容器提供的getRemoteHost()方法獲得訪問Web應用客戶的IP地址和名稱,但是這樣會消耗Web容器的資源,并且還需要通過IP地址和DNS服務器反查用戶的名字。因此當系統(tǒng)上線時,可以將這個屬性關(guān)閉,從而減少資源消耗,那么Web應用也就只能記錄下IP地址。修改的屬性是enableLoopups="false"。
2.2調(diào)整線程數(shù)
Tomcat通過線程池來為用戶訪問提供響應,對于上線的系統(tǒng)初步估計用戶并發(fā)數(shù)量后,再調(diào)整線程池容量。例如,用戶并發(fā)數(shù)量在100左右時,可以設置minProcessors="100",maxProcessors="100"。將最大和最小設置為一樣后,線程池不會再釋放空閑的線程,當用戶訪問突然增加時,不需要再消耗系統(tǒng)資源去創(chuàng)建新的線程。
2.3調(diào)整最大連接數(shù)
這個其實最復雜,即使用戶并發(fā)量大,但是系統(tǒng)反應速度快,也沒必要把這個值設置太高,高了系統(tǒng)需要消耗大量的資源去切換線程,但是如果設置太低也會造成應用無法滿足用戶并發(fā)需要。因此設置這個最好能夠結(jié)合整個系統(tǒng)的跟蹤與調(diào)優(yōu),使系統(tǒng)達到最好的平穩(wěn)狀態(tài),一般設置為maxProcessors的1.5倍即可。
2.4調(diào)整網(wǎng)絡超時
主要是HTTP協(xié)議也有個連接過程,客戶端連接到服務器上后,如果長時間沒有得到處理就會被釋放。如果服務器處理速度較慢,但是希望每個用戶都能得到有效處理,或者網(wǎng)絡環(huán)境不好,需要保證用戶不會因為超時中斷,也可以把時間加長。但是一般設置成connectionTimeout="30000"即可。太長對系統(tǒng)來說價值不大,反而會浪費系統(tǒng)資源在無謂的長連接上。
2.5壓縮管理
tomcat作為一個應用服務器,也是支持gzip壓縮功能的。我們可以在server.xml配置文件中的Connector節(jié)點中配置如下參數(shù),來實現(xiàn)對指定資源類型進行壓縮。
compression="on"#?打開壓縮功能
compressionMinSize="50"#?啟用壓縮的輸出內(nèi)容大小,默認為2KB
noCompressionUserAgents="gozilla,?traviata"#?對于以下的瀏覽器,不啟用壓縮
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"#?哪些資源類型需要壓縮
如果使用apache/nginx代理,所以tomcat自身不需要進行壓縮,會給服務器增加壓力
2.6tomcat的三種運行模式選擇
2.6.1Bio
默認的模式,性能非常低下,沒有經(jīng)過任何優(yōu)化處理和支持。
2.6.2Nio
利用java的異步io護理技術(shù),no blocking IO技術(shù).
想運行在該模式下,直接修改server.xml里的Connector節(jié)點,修改protocol為
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="8443"/>
啟動后,就可以生效。
2.6.3Apr
安裝起來最困難,但是從操作系統(tǒng)級別來解決異步的IO問題,大幅度的提高性能.。必須要安裝apr和native,直接啟動就支持apr。
安裝APR
sudoyum?-yinstallapr??apr-devel
tarzxvf?tomcat-native.tar.gz//該文件在tomcat的bin目錄下面
cdtomcat-native-1.1.24-src/jni/native
./configure--with-apr=/usr/bin/apr-1-config
make
makeinstall
安裝完成之后會出現(xiàn)如下提示信息
Libraries have been installed in:
/usr/local/apr/lib
安裝成功后還需要對tomcat設置環(huán)境變量,方法是在catalina.sh文件中增加一行:
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
修改8080端對應的
protocol="org.apache.coyote.http11.Http11AprProtocol"
2.7Tomcat連接相關(guān)參數(shù)總結(jié)
在Tomcat配置文件server.xml中的配置中
maxThreads?客戶請求最大線程數(shù)
minSpareThreads????Tomcat初始化時創(chuàng)建的?socket?線程數(shù)
maxSpareThreads???Tomcat連接器的最大空閑?socket?線程數(shù)
enableLookups??????若設為true,?則支持域名解析,可把?ip?地址解析為主機名
redirectPort????????在需要基于安全通道的場合,把客戶請求轉(zhuǎn)發(fā)到基于SSL?的?redirectPort端口
acceptAccount???????監(jiān)聽端口隊列最大數(shù),滿了之后客戶請求會被拒絕(不能小于maxSpareThreads??)
connectionTimeout???連接超時
minProcessors?????????服務器創(chuàng)建時的最小處理線程數(shù)
maxProcessors????????服務器同時最大處理線程數(shù)
URIEncoding????URL統(tǒng)一編碼
compression?打開壓縮功能
compressionMinSize???啟用壓縮的輸出內(nèi)容大小,這里面默認為2KB
compressableMimeType?壓縮類型
connectionTimeout?定義建立客戶連接超時的時間.?如果為?-1,?表示不限制建立客戶連接的時間
2.8生產(chǎn)配置實例
URIEncoding="UTF-8"#設置編碼
minSpareThreads="25"#Tomcat初始化時創(chuàng)建的?socket線程數(shù)
maxSpareThreads="75"#Tomcat連接器的最大空閑socket?線程數(shù),一旦創(chuàng)建的線程超過這個值,Tomcat就會關(guān)閉不再需要的socket線程。默認值50
enableLookups="false"#屏蔽DNS查詢
disableUploadTimeout="true"#該標志位表明當執(zhí)行servlet時,是否允許servlet容器使用一個不同的、更長的連接超時。啟用該標志位將導致在上傳數(shù)據(jù)時,要么使用更長的時間完成上傳,要么出現(xiàn)更長的超時。如果不指定,該屬性為“false”。
connectionTimeout="20000"#網(wǎng)絡超時時間
acceptCount="300"#容許的最大連接數(shù),一般設置為maxProcessors的1.5倍即可,滿了之后客戶請求會被拒絕(不能小于maxSpareThreads??)
maxThreads="300"#客戶請求最大線程數(shù),默認值為“200”
maxProcessors="1000"#最大連接線程數(shù),即:并發(fā)處理的最大請求數(shù),默認值為75?,一旦創(chuàng)建的線程超過這個值,Tomcat就會關(guān)閉不再需要的socket線程
minProcessors="5"#最小空閑連接線程數(shù),用于提高系統(tǒng)處理性能,默認值為10
useURIValidationHack="false"
compression="on"#打開壓縮功能
compressionMinSize="2048"#啟用壓縮的輸出內(nèi)容大小,這里面默認為2KB
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"#壓縮類型
-->
redirectPort="8443"/>
3安全優(yōu)化
3.1tomcat影藏版本信息
Tomcat安裝目錄下的lib目錄下,名稱為catalina.jar,直接修改catalina.jar中的文件,org/apache/catalina/util/ServerInfo.properties
server.info=Apache Tomcat/7.0.53
3.2禁用Tomcat管理頁面
我們線上是不使用Tomcat默認提供的管理頁面的,因此都會在初始化的時候就把這些頁面刪掉。這些頁面是存放在Tomcat安裝目錄下的webapps目錄下的。我們只需要刪除該目錄下的所有文件即可。當然,還有涉及管理頁面的2個配置文件host-manager.xml和manager.xml也需要一并刪掉。這兩個文件存放在Tomcat安裝目錄下的conf/Catalina/localhost目錄下。
3.3用普通用戶啟動Tomcat
為了進一步安全,我們不建議使用root來啟動Tomcat。這邊建議使用專用用戶tomcat或者nobody用戶來啟動Tomcat。在啟動之前,需要對我們的tomcat安裝目錄下所有文件的屬主和屬組都設置為指定用戶。
3.4分離Tomcat和項目的用戶
為了防止Tomcat被植入web shell程序后,可以修改項目文件。因此我們要將Tomcat和項目的屬主做分離,這樣子,即便被搞,他也無法創(chuàng)建和編輯項目文件。
3.5關(guān)閉war自動部署
默認Tomcat是開啟了對war包的熱部署的。為了防止被植入木馬等惡意程序,因此我們要關(guān)閉自動部署。
修改實例:
1
2
3
unpackWARs="false"autoDeploy="false">
3.6更改關(guān)閉Tomcat實例的指令
server.xml中定義了可以直接關(guān)閉Tomcat實例的管理端口。我們通過telnet連接上該端口之后,輸入SHUTDOWN(此為默認關(guān)閉指令)即可關(guān)閉Tomcat實例(注意,此時雖然實例關(guān)閉了,但是進程還是存在的)。由于默認關(guān)閉Tomcat的端口和指令都很簡單。默認端口為8005,指令為SHUTDOWN。因此我們需要將關(guān)閉指令修改復雜一點。
當然,在新版的Tomcat中該端口僅監(jiān)聽在127.0.0.1上,因此大家也不必擔心。除非黑客登陸到tomcat本機去執(zhí)行關(guān)閉操作。
修改實例:
1
4內(nèi)核優(yōu)化
在修改內(nèi)核參數(shù)的時候,建議大家逐個設置,然后反復試驗,切勿圖方便直接拿上就用,一次全部替換。
優(yōu)化網(wǎng)絡參數(shù)
修改/etc/sysctl.cnf文件,在最后追加如下內(nèi)容:
net.core.netdev_max_backlog?=?32768
net.core.somaxconn?=?32768
net.core.wmem_default?=?8388608
net.core.rmem_default?=?8388608
net.core.rmem_max?=?16777216
net.core.wmem_max?=?16777216
net.ipv4.ip_local_port_range?=?1024?65000
net.ipv4.route.gc_timeout?=?100
net.ipv4.tcp_fin_timeout?=?30
net.ipv4.tcp_keepalive_time?=?1200
net.ipv4.tcp_timestamps?=?0
net.ipv4.tcp_synack_retries?=?2
net.ipv4.tcp_syn_retries?=?2
net.ipv4.tcp_tw_recycle?=?1
net.ipv4.tcp_tw_reuse?=?1
net.ipv4.tcp_mem?=?94500000?915000000927000000
net.ipv4.tcp_max_orphans?=?3276800
net.ipv4.tcp_max_syn_backlog?=?65536
保存退出,執(zhí)行sysctl-p生效
內(nèi)核參數(shù)詳細作用,可以參考:http://blog.chinaunix.net/uid-21505614-id-2181210.html
作者:北你妹的風
鏈接:http://www.lxweimin.com/p/1d6f53a5a02d
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。