tomcat配置調優與安全總結(轉)
作為運維,避免不了與tomcat打交道,然而作者發現網路上關於tomcat配置和調優安全的文章非常散,通過參考各位大神的相關技術文件,根據作者對tomcat的運維經驗,總結了一些tomcat的基礎運維注意事項,希望對廣大技術兄弟們有些幫助。
本篇文章只是對tomcat模板的基礎調優,除了部署tomcat的各系統環境和配置,影響tomcat併發和效能的另一大重要因素,就是java的程式碼工程,而如何在生產中優化java工程,這個就需要運維與開發共同配合,尤其是運維需要有開發與運維是同一個團隊的意識,只有雙方配合默契才能發揮最大戰力,要知道一個人的力量永遠是有限的,只有團隊合作才能爆發出真正力量!
而包含了Java工程的整體優化就設計到整體的架構優化,這個更加是一個細緻而有趣的過程,也是運維通向架構師的一個必經之路!
1功能優化
1.1硬體資源對tomcat的影響
作者實測,在阿里雲的不同區域部署相同系統應用配置的tomcat,在壓測時會出現吞吐量差異達到1/4,經過對比發現,兩個區域的cpu頻率2.2GHz和2.6Ghz。系統硬體效能直接影響tomcat的併發量,起決定作用的是CPU和MEM,CPU執行速度提升,會帶來tomcat響應時間的縮短,mem大小決定工程需要記憶體的大小和工程的併發數量。
1.2Java虛擬機器調優
1.2.1JDK版本選擇
如果新手請選擇SUN的JVM,在滿足專案需要的前提下,儘量選用版本較高的JVM,一般來說高版本產品在速度和效率上比低版本會有改進。JDK1.4比JDK1.3效能提高了近10%-20%,JDK1.5比JDK1.4效能提高25%-75%。因此對效能要求較高的情況推薦使用JDK1.6。
這裡需要補充的是,各位在打算升級JVM時,一定要先讓開發先試用高版本的JVM,除錯高版本JVM對工程的影響,經過測試後逐步部署到測試環境,經過一定時間的驗證,發現沒有問題後再謹慎的更換到生產。JVM版本不一致,很容易出現各類異常,對待生產,謹慎永遠是第一原則!
JVM調優參見:http://vekergu.blog.51cto.com/9966832/1626733
1.2.2JDK引數優化
Tomcat記憶體優化主要是對tomcat啟動引數優化,我們可以在tomcat的啟動指令碼catalina.sh中設定JAVA_OPTS引數。
1.JAVA_OPTS引數說明
-server 啟用jdk 的 server 版;
-Xms java虛擬機器初始化時的最小記憶體;
-Xmx java虛擬機器可使用的最大記憶體;
-XX:PermSize 記憶體永久保留區域
-XX:MaxPermSize 記憶體最大永久保留區域
-Xms=-Xmx=伺服器記憶體*70%,如部署tomcat,jboss在同一臺伺服器-Xms=-Xmx=伺服器記憶體*80%*1/4,現公司伺服器記憶體一般都可以加到最大4G,所以可以採取以下配置,把以下引數新增到catalina.sh裡面,
JAVA_OPTS='-Xms1024m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=256m-XX:MaxPermSize=256m'
#-Xmx6000m :設定JVM最大可用記憶體為6000MB
#-Xms6000m :設定JVM初始可用記憶體為6000MB
#-Xmn2g :設定年輕代大小為2G
#-Xss128k :設定每個執行緒的堆疊大小為128k
#-XX:NewRatio=4 :設定年輕代與年老代的比值為4
#-XX:SurvivorRatio=4 :設定年輕代中Eden區與Survivor區的大小比值為4
#-XX:PermSize=512m :設定堆疊永久區起始大小為512m
#-XX:MaxPermSize=512m :設定堆疊永久區最大大小為512m
#-XX:MaxTenuringThreshold=0 :設定垃圾最大年齡為0
#-XX:+UseParallelGC :選擇垃圾收集器為並行收集器
#-XX:ParallelGCThreads=8 :配置並行收集器的執行緒數
#-XX:+UseParallelOldGC :配置年老代垃圾收集方式為並行收集
#-XX:+UseAdaptiveSizePolicy :並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低響應時>間或者收集頻率等,此值建議使用並行收集器時,一直開啟。
1.2.3生產案例
根據作者本人的經驗,生產環境需要確定對JVM的設定,還是需要根據java的執行狀態,通過監控後,不斷的除錯的一個過程,沒有那個配置一上來就可以適應所有的場景。以下就舉列作者常用的一個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普遍選擇配置相同的大小,實際大小根據實際情況調整,由小向大增加,沒必要一開始就增加到很大的記憶體。
2.XX:PermSize設定堆疊永久區起始大小,XX:MaxPermSize設定堆疊永久區最大大,其實設定比預設值大寫即可,或者預設也可以。作者這個這兩個值,是因為出現過永久區記憶體溢位,才進行設定的。
3.UseParallelOldGC、PrintGCDateStamps、PrintGCDetails、Xloggc:/opt/tomcat/log/gc.log設定GClog日誌,這個對分析tomcat中JVM記憶體使用情況非常有效。
4.XX:+HeapDumpOnOutOfMemoryError、XX:HeapDumpPath=/opt/tomcat/heap.bin"設定記憶體溢位時,輸出HeapDump,具體如何使用分析HeapDump檔案,請參考:http://vekergu.blog.51cto.com/9966832/1619640
5.作者對JVM引數設定的做法,調整合適的JVM記憶體大小,開啟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站點的預設網頁、自定義錯誤頁面、禁止列目錄等功能
這些功能開發會在工程的WEB-INF目錄下的web.xml中設定,運維瞭解下就好,者遇到類似問題可以找到解決思路。
1.4.1預設主頁
1.4.2自定義錯誤頁面
1.4.3定義會話超時時間
1.4.4禁止列目錄
1.5管理AJP埠
AJP是為Tomcat與HTTP伺服器之間通訊而定製的協議,能提供較高的通訊速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個聯結器。由於我們公司前端是由nginx做的反向代理,因此不使用此聯結器,因此需要登出掉該聯結器。在{TOMCST_HOME}/conf/server.xml中找到下列程式碼,註釋即可
1.6取消預設gc監聽
如果開啟了GClog,再開啟GC監聽,會影響GClog輸出,功能重複,可以選擇取消。
1.7自定義tomcat程式碼路徑(2015-7-21新增)
其中:
docBase這個是你程式碼的路徑
path這個是你訪問網站的URL路徑,要區別path的意義,請看下面的舉例
舉例:
訪問www.aaa.com
訪問www.aaa.com/code_file
reloadable如果為true,會自動載入變化的動態檔案,看起來挺智慧的,但是,在tomcat載入變化程式碼的時候有可能會出現記憶體溢位,tomcat服務不正常等異常,建議還是false掉,更新完程式碼指令碼重啟tomcat才是王道。
此前看到一些文章,在講解自定義tomcat程式碼路徑時,reloadable全部是true,可能能多小夥伴都設定為true,建議對這個引數認真對待,否則一不小心就是一個坑。。。。
2效能優化
2.1遮蔽DNS查詢
Web應用程式可以通過Web容器提供的getRemoteHost()方法獲得訪問Web應用客戶的IP地址和名稱,但是這樣會消耗Web容器的資源,並且還需要通過IP地址和DNS伺服器反查使用者的名字。因此當系統上線時,可以將這個屬性關閉,從而減少資源消耗,那麼Web應用也就只能記錄下IP地址。修改的屬性是enableLoopups="false"。
2.2調整執行緒數
Tomcat通過執行緒池來為使用者訪問提供響應,對於上線的系統初步估計使用者併發數量後,再調整執行緒池容量。例如,使用者併發數量在100左右時,可以設定minProcessors="100",maxProcessors="100"。將最大和最小設定為一樣後,執行緒池不會再釋放空閒的執行緒,當使用者訪問突然增加時,不需要再消耗系統資源去建立新的執行緒。
2.3調整最大連線數
這個其實最複雜,即使使用者併發量大,但是系統反應速度快,也沒必要把這個值設定太高,高了系統需要消耗大量的資源去切換執行緒,但是如果設定太低也會造成應用無法滿足使用者併發需要。因此設定這個最好能夠結合整個系統的跟蹤與調優,使系統達到最好的平穩狀態,一般設定為maxProcessors的1.5倍即可。
2.4調整網路超時
主要是HTTP協議也有個連線過程,客戶端連線到伺服器上後,如果長時間沒有得到處理就會被釋放。如果伺服器處理速度較慢,但是希望每個使用者都能得到有效處理,或者網路環境不好,需要保證使用者不會因為超時中斷,也可以把時間加長。但是一般設定成connectionTimeout="30000"即可。太長對系統來說價值不大,反而會浪費系統資源在無謂的長連線上。
2.5壓縮管理
tomcat作為一個應用伺服器,也是支援gzip壓縮功能的。我們可以在server.xml配置檔案中的Connector節點中配置如下引數,來實現對指定資源型別進行壓縮。
compression="on"# 開啟壓縮功能
compressionMinSize="50"# 啟用壓縮的輸出內容大小,預設為2KB
noCompressionUserAgents="gozilla, traviata"# 對於以下的瀏覽器,不啟用壓縮
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"# 哪些資源型別需要壓縮
如果使用apache/nginx代理,所以tomcat自身不需要進行壓縮,會給伺服器增加壓力
2.6tomcat的三種執行模式選擇
2.6.1Bio
預設的模式,效能非常低下,沒有經過任何優化處理和支援。
2.6.2Nio
利用java的非同步io護理技術,no blocking IO技術.
想執行在該模式下,直接修改server.xml裡的Connector節點,修改protocol為
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
enableLookups="false"
redirectPort="8443"/>
啟動後,就可以生效。
2.6.3Apr
安裝起來最困難,但是從作業系統級別來解決非同步的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
安裝完成之後會出現如下提示資訊
Libraries have been installed in:
/usr/local/apr/lib
安裝成功後還需要對tomcat設定環境變數,方法是在catalina.sh檔案中增加一行:
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
修改8080端對應的
protocol="org.apache.coyote.http11.Http11AprProtocol"
2.7Tomcat連線相關引數總結
在Tomcat配置檔案server.xml中的配置中
maxThreads 客戶請求最大執行緒數
minSpareThreads Tomcat初始化時建立的 socket 執行緒數
maxSpareThreads Tomcat聯結器的最大空閒 socket 執行緒數
enableLookups 若設為true, 則支援域名解析,可把 ip 地址解析為主機名
redirectPort 在需要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort埠
acceptAccount 監聽埠佇列最大數,滿了之後客戶請求會被拒絕(不能小於maxSpareThreads )
connectionTimeout 連線超時
minProcessors 伺服器建立時的最小處理執行緒數
maxProcessors 伺服器同時最大處理執行緒數
URIEncoding URL統一編碼
compression 開啟壓縮功能
compressionMinSize 啟用壓縮的輸出內容大小,這裡面預設為2KB
compressableMimeType 壓縮型別
connectionTimeout 定義建立客戶連線超時的時間. 如果為 -1, 表示不限制建立客戶連線的時間
2.8生產配置例項
URIEncoding="UTF-8"#設定編碼
minSpareThreads="25"#Tomcat初始化時建立的 socket執行緒數
maxSpareThreads="75"#Tomcat聯結器的最大空閒socket 執行緒數,一旦建立的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒。預設值50
enableLookups="false"#遮蔽DNS查詢
disableUploadTimeout="true"#該標誌位表明當執行servlet時,是否允許servlet容器使用一個不同的、更長的連線超時。啟用該標誌位將導致在上傳資料時,要麼使用更長的時間完成上傳,要麼出現更長的超時。如果不指定,該屬性為“false”。
connectionTimeout="20000"#網路超時時間
acceptCount="300"#容許的最大連線數,一般設定為maxProcessors的1.5倍即可,滿了之後客戶請求會被拒絕(不能小於maxSpareThreads )
maxThreads="300"#客戶請求最大執行緒數,預設值為“200”
maxProcessors="1000"#最大連線執行緒數,即:併發處理的最大請求數,預設值為75 ,一旦建立的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒
minProcessors="5"#最小空閒連線執行緒數,用於提高系統處理效能,預設值為10
useURIValidationHack="false"
compression="on"#開啟壓縮功能
compressionMinSize="2048"#啟用壓縮的輸出內容大小,這裡面預設為2KB
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"#壓縮型別
-->
redirectPort="8443"/>
3安全優化
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和專案的屬主做分離,這樣子,即便被搞,他也無法建立和編輯專案檔案。
3.5關閉war自動部署
預設Tomcat是開啟了對war包的熱部署的。為了防止被植入木馬等惡意程式,因此我們要關閉自動部署。
修改例項:
1
2
3
unpackWARs="false"autoDeploy="false">
3.6更改關閉Tomcat例項的指令
server.xml中定義了可以直接關閉Tomcat例項的管理埠。我們通過telnet連線上該埠之後,輸入SHUTDOWN(此為預設關閉指令)即可關閉Tomcat例項(注意,此時雖然例項關閉了,但是程式還是存在的)。由於預設關閉Tomcat的埠和指令都很簡單。預設埠為8005,指令為SHUTDOWN。因此我們需要將關閉指令修改複雜一點。
當然,在新版的Tomcat中該埠僅監聽在127.0.0.1上,因此大家也不必擔心。除非黑客登陸到tomcat本機去執行關閉操作。
修改例項:
1
4核心優化
在修改核心引數的時候,建議大家逐個設定,然後反覆試驗,切勿圖方便直接拿上就用,一次全部替換。
優化網路引數
修改/etc/sysctl.cnf檔案,在最後追加如下內容:
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
儲存退出,執行sysctl-p生效
核心引數詳細作用,可以參考:http://blog.chinaunix.net/uid-21505614-id-2181210.html
作者:北你妹的風
連結:http://www.jianshu.com/p/1d6f53a5a02d
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
相關文章
- JVM調優總結-調優方法JVM
- JVM調優總結-典型配置舉例1JVM
- JVM調優總結-典型配置舉例2JVM
- Apache tomcat 配置總結ApacheTomcat
- JVM調優總結(十)-調優方法JVM
- Tomcat調優總結(Tomcat自身最佳化、Linux核心最佳化、JVM最佳化)【轉】TomcatLinuxJVM
- Oracle 調優總結Oracle
- Oracle調優總結Oracle
- JVM調優總結(七)-典型配置舉例1JVM
- JVM調優總結(八)-典型配置舉例2JVM
- 【轉】JVM調優總結(二)-一些概念JVM
- Nginx安全優化與效能調優Nginx優化
- JVM調優總結(十一)-反思JVM
- 各種交換機埠安全總結(配置例項)(轉)
- MySQL 索引和 SQL 調優總結MySql索引
- Linux基礎優化與安全歸納總結Linux優化
- JVM調優總結:一些概念JVM
- linux調優的一點總結Linux
- Java Web之Tomcat調優JavaWebTomcat
- Tomcat常用優化配置Tomcat優化
- Tomcat執行緒模型 BIO模型原始碼與調優Tomcat執行緒模型原始碼
- Tomcat+Nginx+Lvs部署方案與效能調優TomcatNginx
- 一次效能測試調優總結
- 【JVM進階之路】十:JVM調優總結JVM
- oracle 記憶體分配和調優 總結Oracle記憶體
- JVM調優總結(一)-- 一些概念JVM
- JVM調優總結(二)-一些概念JVM
- jvm 調優總結 -Xms -Xmx -Xmn -XssJVM
- tomcat漏洞總結Tomcat
- MySQL使用與優化總結MySql優化
- 【sql調優】繫結變數與CBOSQL變數
- 讀egyle的sga調整總結(轉)
- linux下tomcat安全配置LinuxTomcat
- Tomcat高階配置(應用場景總結及示例)Tomcat
- JVM調優引數、方法、工具以及案例總結JVM
- Hive所有的配置總結 轉載Hive
- Tomcat高階特性及效能調優Tomcat
- MVP 與 MVVM 優缺點總結MVPMVVM