tomcat配置調優與安全總結(轉)

weixin_33890499發表於2017-12-14

作為運維,避免不了與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預設主頁

1817777-661a8d2f9e2d99c5.png

1.4.2自定義錯誤頁面

1817777-d9a808c7832ed054.png

1.4.3定義會話超時時間

1817777-d840d5cc7313ba2a.png

1.4.4禁止列目錄

1817777-d3f2b42f12d6fded.png

1.5管理AJP埠

AJP是為Tomcat與HTTP伺服器之間通訊而定製的協議,能提供較高的通訊速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個聯結器。由於我們公司前端是由nginx做的反向代理,因此不使用此聯結器,因此需要登出掉該聯結器。在{TOMCST_HOME}/conf/server.xml中找到下列程式碼,註釋即可

1817777-2d8248f405c644dd.png

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

來源:簡書

著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章