国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

Tomcat8 安全配置與性能優(yōu)化

2017-04-03 08:07:07 4142

1.關(guān)于Tomcat的session數(shù)目 

這個(gè)可以直接從Tomcat的web管理界面去查看即可 

或者借助于第三方工具Lambda Probe來查看,它相對(duì)于Tomcat自帶的管理稍微多了點(diǎn)功能,但也不多 

 

2.監(jiān)視Tomcat的內(nèi)存使用情況 

使用JDK自帶的jconsole可以比較明了的看到內(nèi)存的使用情況,線程的狀態(tài),當(dāng)前加載的類的總量等 

JDK自帶的jvisualvm可以下載插件(如GC等),可以查看更豐富的信息。如果是分析本地的Tomcat的話,還可以進(jìn)行內(nèi)存抽樣等,檢查每個(gè)類的使用情況 

 

3.打印類的加載情況及對(duì)象的回收情? 

這個(gè)可以通過配置JVM的啟動(dòng)參數(shù),打印這些信息(到屏幕(默認(rèn)也會(huì)到catalina.log中)或者文件),具體參數(shù)如下: 

-XX:+PrintGC:輸出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] 

-XX:+PrintGCDetails:輸出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] 

-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可與上面兩個(gè)混合使用,輸出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] 

-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中斷的執(zhí)行時(shí)間。可與上面混合使用。輸出形式:Application time: 0.5291524 seconds 

-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期間程序暫停的時(shí)間。可與上面混合使用。輸出形式:Total time for which application threads were stopped: 0.0468229 seconds 

-XX:PrintHeapAtGC: 打印GC前后的詳細(xì)堆棧信息 

-Xloggc:filename:與上面幾個(gè)配合使用,把相關(guān)日志信息記錄到文件以便分析 

 

-verbose:class 監(jiān)視加載的類的情況 

-verbose:gc 在虛擬機(jī)發(fā)生內(nèi)存回收時(shí)在輸出設(shè)備顯示信息 

-verbose:jni 輸出native方法調(diào)用的相關(guān)情況,一般用于診斷jni調(diào)用錯(cuò)誤信息 

 

4.添加JMS遠(yuǎn)程監(jiān)控 

對(duì)于部署在局域網(wǎng)?其它機(jī)器上的Tomcat,可以打開JMX監(jiān)控端口,局域網(wǎng)其它機(jī)器就可以通過這個(gè)端口查看一些常用的參數(shù)(但一些比較復(fù)雜的功能不支持),同樣是在JVM啟動(dòng)參數(shù)中配置即可,配置如下: 

-Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false 

-Djava.rmi.server.hostname=192.168.71.38 設(shè)置JVM的JMS監(jiān)控監(jiān)聽的IP地址,主要是為了防止錯(cuò)誤的監(jiān)聽成127.0.0.1這個(gè)內(nèi)網(wǎng)地址 

-Dcom.sun.management.jmxremote.port=1090 設(shè)置JVM的JMS監(jiān)控的端口 

-Dcom.sun.management.jmxremote.ssl=false 設(shè)置JVM的JMS監(jiān)控不實(shí)用SSL 

-Dcom.sun.management.jmxremote.authenticate=false 設(shè)置JVM的JMS監(jiān)控不需要認(rèn)證 

 

 

5.專業(yè)點(diǎn)的分析工具有 

IBM ISA,JProfiler等,具體監(jiān)控及分析方式去網(wǎng)上搜索即可。 

  

集群方案

單個(gè)Tomcat的處理性能是有限的,當(dāng)并發(fā)量較大的時(shí)候,就需要有部署多套來進(jìn)行負(fù)載均衡了。 

 

集群的關(guān)鍵點(diǎn)有以下幾點(diǎn): 

1.引入負(fù)載端

軟負(fù)載可以使用nginx或者apache來進(jìn)行,主要是使用一個(gè)分發(fā)的功能 

參考: 

http://www.tjdsmy.cn/blog/1715312(nginx負(fù)載) 

http://www.tjdsmy.cn/blog/1717121(apache負(fù)載) 

 

2.共享session處理 

目前的處理方式有如下幾種: 

1).使用Tomcat本身的Session復(fù)制功能

參考http://www.tjdsmy.cn/blog/1715312(Session復(fù)制的配置)方案的優(yōu)點(diǎn)是配置簡單,缺點(diǎn)是當(dāng)集群數(shù)量較多時(shí),Session復(fù)制的時(shí)間會(huì)比較長,影響響應(yīng)的效率;

2).使用第三方來存放共享Session

目前用的較多的是使用memcached來管理共享Session,借助于memcached-sesson-manager來進(jìn)行Tomcat的Session管理,參考http://www.tjdsmy.cn/blog/1716320(使用MSM管理Tomcat集群session) 

3).使用黏性session的策略 

對(duì)于會(huì)話要求不太強(qiáng)(不涉及到計(jì)費(fèi),失敗了允許重新請(qǐng)求下等)的場合,同一個(gè)用戶的session可以由nginx或者apache交給同一個(gè)Tomcat來處理,這就是所謂的session sticky策略,目前應(yīng)用也比較多,參考:http://www.tjdsmy.cn/blog/1848665(tomcat session sticky),nginx默認(rèn)不包含session sticky模塊,需要重新編譯才行,優(yōu)點(diǎn)是處理效率高多了,缺點(diǎn)是強(qiáng)會(huì)話要求的場合不合適 

 

3.小結(jié) 

以上是實(shí)現(xiàn)集群的要點(diǎn),其中1和2可以組合使用,具體場景具體分析吧~

 

JVM優(yōu)化

Tomcat本身還是運(yùn)行在JVM上的,通過對(duì)JVM參數(shù)的調(diào)整我們可以使Tomcat擁有更好的性能。針對(duì)JVM的優(yōu)化目前主要在兩個(gè)方面: 

1.內(nèi)存調(diào)優(yōu)

內(nèi)存方式的設(shè)置是在catalina.sh中,調(diào)整一下JAVA_OPTS變量即可,因?yàn)楹竺娴膯?dòng)參數(shù)會(huì)把JAVA_OPTS作為JVM的啟動(dòng)參數(shù)來處理。 

具體設(shè)置如下: 

JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4" 

其各項(xiàng)參數(shù)如下: 

-Xmx3550m:設(shè)置JVM最大可用內(nèi)存為3550M。 

-Xms3550m:設(shè)置JVM促使內(nèi)存為3550m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。 

-Xmn2g:設(shè)置年輕代大小為2G。整個(gè)堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會(huì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大,Sun官方推薦配置為整個(gè)堆的3/8。 

-Xss128k:設(shè)置每個(gè)線程的堆棧大小。JDK5.0以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K。更具應(yīng)用的線程所需內(nèi)存大小進(jìn)行 調(diào)整。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗(yàn)值在3000~5000左右。

-XX:NewRatio=4:設(shè)置年輕代(包括Eden和兩個(gè)Survivor區(qū))與年老代的比值(除去持久代)。設(shè)置為4,則年輕代與年老代所占比值為1:4,年輕代占整個(gè)堆棧的1/5。

-XX:SurvivorRatio=4:設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設(shè)置為4,則兩個(gè)Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:4,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/6。

-XX:MaxPermSize=16m:設(shè)置持久代大小為16m。

-XX:MaxTenuringThreshold=0:設(shè)置垃圾最大年齡。如果設(shè)置為0的話,則年輕代對(duì)象不經(jīng)過Survivor區(qū),直接進(jìn)入年老代。 對(duì)于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一個(gè)較大值,則年輕代對(duì)象會(huì)在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對(duì)象再年輕代的存活 時(shí)間,增加在年輕代即被回收的概論。

2.垃圾回收策略調(diào)優(yōu)

垃圾回收的設(shè)置也是在catalina.sh中,調(diào)整JAVA_OPTS變量。

具體設(shè)置如下: 

JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100" 

具體的垃圾回收策略及相應(yīng)策略的各項(xiàng)參數(shù)如下: 

串行收集器?JDK1.5以前主要的回收方式) 

-XX:+UseSerialGC:設(shè)置串行收集器 

并行收集器(吞吐量優(yōu)先) 

示例:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 

-XX:+UseParallelGC:選擇垃圾收集器為并行收集器。此配置僅對(duì)年輕代有效。即上述配置下,年輕代使用并發(fā)收集,而年老代仍舊使用串行收集。

-XX:ParallelGCThreads=20:配置并行收集器的線程數(shù),即:同時(shí)多少個(gè)線程一起進(jìn)行垃圾回收。此值最好配置與處理器數(shù)目相等。

-XX:+UseParallelOldGC:配置年老代垃圾收集方式為并行收集。JDK6.0支持對(duì)年老代并行收集。

-XX:MaxGCPauseMillis=100:設(shè)置每次年輕代垃圾回收的最長時(shí)間,如果無法滿足此時(shí)間,JVM會(huì)自動(dòng)調(diào)整年輕代大小,以滿足此值。

-XX:+UseAdaptiveSizePolicy:設(shè)置此選項(xiàng)后,并行收集器會(huì)自動(dòng)選擇年輕代區(qū)大小和相應(yīng)的Survivor區(qū)比例,以達(dá)到目標(biāo)系統(tǒng)規(guī)定的最?相應(yīng)時(shí)間或者收集頻率等,此值建議使用并行收集器時(shí),一直打開。

并發(fā)收集器(響應(yīng)時(shí)間優(yōu)先)

示例:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC 

-XX:+UseConcMarkSweepGC:設(shè)置年老代為并發(fā)收集。測試中配置這個(gè)以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此時(shí)年輕代大小最好用-Xmn設(shè)置。 

-XX:+UseParNewGC: 設(shè)置年輕代為并行收集??膳cCMS收集同時(shí)使用。JDK5.0以上,JVM會(huì)根據(jù)系統(tǒng)配置自行設(shè)置,所以無需?設(shè)置此值。

-XX:CMSFullGCsBeforeCompaction:由于并發(fā)收集器不對(duì)內(nèi)存空間進(jìn)行壓縮、整理,所以運(yùn)行一段時(shí)間以后會(huì)產(chǎn)生“碎片”,使得運(yùn)行效率降低。此值設(shè)置運(yùn)行多少次GC以后對(duì)內(nèi)存空間進(jìn)行壓縮、整理。

-XX:+UseCMSCompactAtFullCollection:打開對(duì)年老代的壓縮??赡軙?huì)影響性能,但是可以消除碎片。

3.小結(jié)

在內(nèi)存設(shè)置中需要做一下權(quán)衡

1)內(nèi)存越大,一般情況下處理的效率?越高,但同時(shí)在做垃圾回收的時(shí)候所需要的時(shí)間也就越長,在這段時(shí)間內(nèi)的處理效率是必然要受影響的。

2)在大多數(shù)的網(wǎng)絡(luò)文章中都推薦 Xmx和Xms設(shè)置為一致,說是避免頻繁的回收,這個(gè)在測試的時(shí)候沒有看到明顯的效果,內(nèi)存的占用情況基本都是鋸齒狀的效果,所以這個(gè)還要根據(jù)實(shí)際情況來定。

Server.xml的Connection優(yōu)化

Tomcat的Connector是Tomcat接收HTTP請(qǐng)求的關(guān)鍵模塊,我們可以配置它來指定IO模式,以及處理通過這個(gè)Connector接受到的請(qǐng)求的處理線程數(shù)以及其它一些常用的HTTP策略。其主要配置參數(shù)如下:

1.指定使用NIO模型來接受HTTP請(qǐng)求

protocol="org.apache.coyote.http11.Http11NioProtocol" 指定使用NIO模型來接受HTTP請(qǐng)求。默認(rèn)是BlockingIO,配置為protocol="HTTP/1.1" 

acceptorThreadCount="2" 使用NIO模型時(shí)接收線程的數(shù)目 

2.指定使用線程池來處理HTTP請(qǐng)求 

首先要配置一個(gè)線程池來處?請(qǐng)求(與Connector是平級(jí)的,多個(gè)Connector可以使用同一個(gè)線程池來處理請(qǐng)求) 

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 

maxThreads="1000" minSpareThreads="50" maxIdleTime="600000"/> 

<Connector port="8080" 

executor="tomcatThreadPool" 指定使用的線程池 

3.指定BlockingIO模式下的處理線程數(shù)目

maxThreads="150"//Tomcat使用線程來處理接收的每個(gè)請(qǐng)求。這個(gè)值表示Tomcat可創(chuàng)建的最大的線程數(shù)。默認(rèn)值200??梢愿鶕?jù)機(jī)器的時(shí)期性能和內(nèi)存大小調(diào)整,一般可以在400-500。最大可以在800左右。

minSpareThreads="25"---Tomcat初始化時(shí)創(chuàng)建的線程數(shù)。默認(rèn)值4。如果當(dāng)前沒有空閑線程,且沒有超過maxThreads,一次性創(chuàng)建的空閑線程數(shù)量。Tomcat初始化時(shí)創(chuàng)建的線程數(shù)量也由此值設(shè)置。

maxSpareThreads="75"--一旦創(chuàng)建的線程超過這個(gè)值,Tomcat就會(huì)關(guān)閉不?需要的socket線程。默認(rèn)值50。一旦創(chuàng)建的線程 超過此數(shù)值,Tomcat會(huì)關(guān)閉不再需要的線程。線程數(shù)可以大致上用 “同時(shí)在線人數(shù)*每秒用戶操作次數(shù)*系統(tǒng)平均操作時(shí)間” 來計(jì)算。

acceptCount="100"----指定當(dāng)所有可以使用的處理請(qǐng)求的線程數(shù)都被使用時(shí),可以放到處理隊(duì)列中的請(qǐng)求數(shù),超過這個(gè)數(shù)的請(qǐng)求將不予處 理。默認(rèn)值10。如果當(dāng)前可用線程數(shù)為0,則將請(qǐng)求放入處理隊(duì)列中。這個(gè)值限定了請(qǐng)求隊(duì)列的大小,超過這個(gè)數(shù)值的請(qǐng)求將不予處理。

connectionTimeout="20000" --網(wǎng)絡(luò)連接超時(shí),默認(rèn)值20000,單位:毫秒。設(shè)置為0表示永不超時(shí),這樣設(shè)置有隱患的。通??稍O(shè)置為30000毫秒。

4.其它常用設(shè)置

maxHttpHeaderSize="8192" http請(qǐng)求頭信息的最大程度,超過此長度的部分不予處理。一般8K;

URIEncoding="UTF-8" 指定Tomcat容器的URL編碼格式;

disableUploadTimeout="true" 上傳時(shí)是否使用超時(shí)機(jī)制;

enableLookups="false"--是否反查域名,默認(rèn)值為true,為了提高處理能力,應(yīng)設(shè)置為false;

compression="on"   打開壓縮功能;

compressionMinSize="10240" 啟用壓縮的輸出內(nèi)容大小,默認(rèn)為2KB;

noCompressionUserAgents="gozilla, traviata"   對(duì)于以下的瀏覽器,不啟用壓縮;

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮。

5.小結(jié)

關(guān)于Tomcat的Nio和ThreadPool,本身的引入就提高了處理的復(fù)雜性,所以對(duì)于效率的提高有多少,需要實(shí)際驗(yàn)證一下。

6.配置示例 

<Connector port="8080" 

redirectPort="8443" 

maxThreads="150" 

minSpareThreads="25" 

maxSpareThreads="75" 

acceptCount="100" 

connectionTimeout="20000" 

protocol="HTTP/1.1" 

 

maxHttpHeaderSize="8192" 

URIEncoding="UTF-8" 

disableUploadTimeout="true" 

enableLookups="false" 

compression="on" 

compressionMinSize="10240" 

noCompressionUserAgents="gozilla, traviata" 

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"> 

... 

</Connector>

    管理AJP端口

AJP是為 Tomcat 與 HTTP 服務(wù)器之間通信而定制的協(xié)議,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時(shí)候,會(huì)使用到AJP這個(gè)連接器。由于我們公司前端是由nginx做的反向代理,因此不使用此連接器,因此需要注銷掉該連接器。

<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->

默認(rèn) Tomcat 是開啟了對(duì)war包的熱部署的。為了防止被植入木馬等惡意程序,因此我們要關(guān)閉自動(dòng)部署。

修改實(shí)例:

<Host name="localhost"  appBase=""    unpackWARs="false" autoDeploy="false">


提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問題: