tomcat配置調優與安全總結javascript
做爲運維,避免不了與tomcat打交道,然而做者發現網絡上關於tomcat配置和調優安全的文章很是散,經過參考各位大神的相關技術文檔,根據做者對tomcat的運維經驗,總結了一些tomcat的基礎運維注意事項,但願對廣大技術兄弟們有些幫助。css
本篇文章只是對tomcat模板的基礎調優,除了部署tomcat的各系統環境和配置,影響tomcat併發和性能的另外一大重要因素,就是java的代碼工程,而如何在生產中優化java工程,這個就須要運維與開發共同配合,尤爲是運維須要有開發與運維是同一個團隊的意識,只有雙方配合默契才能發揮最大戰力,要知道一我的的力量永遠是有限的,只有團隊合做才能爆發出真正力量!html
而包含了Java工程的總體優化就設計到總體的架構優化,這個更加是一個細緻而有趣的過程,也是運維通向架構師的一個必經之路!前端
做者實測,在阿里雲的不一樣區域部署相同系統應用配置的tomcat,在壓測時會出現吞吐量差別達到1/4,通過對比發現,兩個區域的cpu頻率2.2GHz和2.6Ghz。系統硬件性能直接影響tomcat的併發量,起決定做用的是CPU和MEM,CPU運行速度提高,會帶來tomcat響應時間的縮短,mem大小決定工程須要內存的大小和工程的併發數量。java
若是新手請選擇SUN的JVM,在知足項目須要的前提下,儘可能選用版本較高的JVM,通常來講高版本產品在速度和效率上比低版本會有改進。 JDK1.4比JDK1.3性能提升了近10%-20%,JDK1.5比JDK1.4性能提升25%-75%。 所以對性能要求較高的狀況推薦使用 JDK1.6。nginx
這裏須要補充的是,各位在打算升級JVM時,必定要先讓開發先試用高版本的JVM,調試高版本JVM對工程的影響,通過測試後逐步部署到測試環境,通過必定時間的驗證,發現沒有問題後再謹慎的更換到生產。JVM版本不一致,很容易出現各種異常,對待生產,謹慎永遠是第一原則!web
JVM調優參見:http://vekergu.blog.51cto.com/9966832/1626733shell
Tomcat內存優化主要是對 tomcat 啓動參數優化,咱們能夠在 tomcat 的啓動腳本 catalina.sh 中設置 JAVA_OPTS參數。apache
1 -server 啓用jdk 的 server 版; 2 -Xms java虛擬機初始化時的最小內存; 3 -Xmx java虛擬機可以使用的最大內存; 4 -XX:PermSize 內存永久保留區域 5 -XX:MaxPermSize 內存最大永久保留區域 6 -Xms=-Xmx=服務器內存*70%,如部署tomcat,jboss在同一臺服務器-Xms=-Xmx=服務器內存*80%*1/4,現公司服務器內存通常均可以加到最大4G,因此能夠採起如下配置,把如下參數添加到catalina.sh裏面, 7 JAVA_OPTS='-Xms1024m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=256m-XX:MaxPermSize=256m' 8 9 #-Xmx6000m :設置JVM最大可用內存爲6000MB 10 #-Xms6000m :設置JVM初始可用內存爲6000MB 11 #-Xmn2g :設置年輕代大小爲2G 12 #-Xss128k :設置每一個線程的堆棧大小爲128k 13 #-XX:NewRatio=4 :設置年輕代與年老代的比值爲4 14 #-XX:SurvivorRatio=4 :設置年輕代中Eden區與Survivor區的大小比值爲4 15 #-XX:PermSize=512m :設置堆棧永久區起始大小爲512m 16 #-XX:MaxPermSize=512m :設置堆棧永久區最大大小爲512m 17 #-XX:MaxTenuringThreshold=0 :設置垃圾最大年齡爲0 18 #-XX:+UseParallelGC :選擇垃圾收集器爲並行收集器 19 #-XX:ParallelGCThreads=8 :配置並行收集器的線程數 20 #-XX:+UseParallelOldGC :配置年老代垃圾收集方式爲並行收集 21 #-XX:+UseAdaptiveSizePolicy :並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低響應時>間或者收集頻率等,此值建議使用並行收集器時,一直打開。
根據做者本人的經驗,生產環境須要肯定對JVM的設置,仍是須要根據java的運行狀態,經過監控後,不斷的調試的一個過程,沒有那個配置一上來就能夠適應全部的場景。如下就舉列做者經常使用的一個JVM配置方式:瀏覽器
1 JAVA_OPTS=" 2 -server 3 -Xms1024m 4 -Xmx1024m 5 -Xmn384m 6 -XX:PermSize=64m 7 -XX:MaxPermSize=128m 8 -XX:+UseParallelOldGC 9 -XX:+PrintGCDateStamps 10 -XX:+PrintGCDetails 11 -Xloggc:/opt/tomcat/log/gc.log 12 -XX:+HeapDumpOnOutOfMemoryError 13 -XX:HeapDumpPath=/opt/tomcat/heap.bin"
說明:
在{TOMCST_HOME}/conf/server.xml取消下面代碼註釋便可:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
具體配置方法見:http://vekergu.blog.51cto.com/9966832/1672833
這些功能開發會在工程的WEB-INF目錄下的web.xml中設置,運維瞭解下就好,者遇到相似問題能夠找到解決思路。
1 <welcome-file-list> 2 <welcome-file>index.html</welcome-file> 3 <welcome-file>index.htm</welcome-file> 4 <welcome-file>index.jsp</welcome-file> 5 </welcome-file-list>
1 <error-page> 2 <error-code>404</error-code> 3 <location>/404.htm</location> 4 </error-page>
1 <session-config> 2 <session-timeout>30</session-timeout> 3 </session-config>
1 <init-param> 2 <param-name>listings</param-name> 3 <param-value>false</param-value> 4 </init-param
AJP是爲 Tomcat 與 HTTP 服務器之間通訊而定製的協議,能提供較高的通訊速度和效率。若是tomcat前端放的是apache的時候,會使用到AJP這個鏈接器。因爲咱們公司前端是由nginx作的反向代理,所以不使用此鏈接器,所以須要註銷掉該鏈接器。在 {TOMCST_HOME}/conf/server.xml中找到下列代碼,註釋便可
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
若是開啓了GClog,再開啓GC監聽,會影響GClog輸出,功能重複,能夠選擇取消。
1 <!-- 2 <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 3 -->
1 <Context docBase="/code_path/code_file"path="/code_file " reloadable="false" />
其中:
docBase這個是你代碼的路徑
path這個是你訪問網站的URL路徑,要區別path的意義,請看下面的舉例
舉例:
1 訪問www.aaa.com 2 <Context docBase="/code_path/code_file"path=" " reloadable="false" /> 3 4 訪問www.aaa.com/code_file 5 <Context docBase="/code_path/code_file"path="/code_file " reloadable="fasle" />
reloadable若是爲true,會自動加載變化的動態文件,看起來挺智能的,可是,在tomcat加載變化代碼的時候有可能會出現內存溢出,tomcat服務不正常等異常,建議仍是false掉,更新完代碼腳本重啓tomcat纔是王道。
此前看到一些文章,在講解自定義tomcat代碼路徑時,reloadable所有是true,可能能多小夥伴都設置爲true,建議對這個參數認真對待,不然一不當心就是一個坑。。。。
Web應用程序能夠經過Web容器提供的getRemoteHost()方法得到訪問Web應用客戶的IP地址和名稱,可是這樣會消耗Web容器的資源,而且還須要經過IP地址和DNS服務器反查用戶的名字。所以當系統上線時,能夠將這個屬性關閉,從而減小資源消耗,那麼Web應用也就只能記錄下IP地址。修改的屬性是enableLoopups="false"。
Tomcat經過線程池來爲用戶訪問提供響應,對於上線的系統初步估計用戶併發數量後,再調整線程池容量。例如,用戶併發數量在100左右時,能夠設置minProcessors="100",maxProcessors="100"。將最大和最小設置爲同樣後,線程池不會再釋放空閒的線程,當用戶訪問忽然增長時,不須要再消耗系統資源去建立新的線程。
這個其實最複雜,即便用戶併發量大,可是系統反應速度快,也不必把這個值設置過高,高了系統須要消耗大量的資源去切換線程,可是若是設置過低也會形成應用沒法知足用戶併發須要。所以設置這個最好可以結合整個系統的跟蹤與調優,使系統達到最好的平穩狀態,通常設置爲maxProcessors的1.5倍便可。
主要是HTTP協議也有個鏈接過程,客戶端鏈接到服務器上後,若是長時間沒有獲得處理就會被釋放。若是服務器處理速度較慢,可是但願每一個用戶都能獲得有效處理,或者網絡環境很差,須要保證用戶不會由於超時中斷,也能夠把時間加長。可是通常設置成connectionTimeout="30000"便可。太長對系統來講價值不大,反而會浪費系統資源在無謂的長鏈接上。
tomcat做爲一個應用服務器,也是支持 gzip 壓縮功能的。咱們能夠在 server.xml 配置文件中的 Connector 節點中配置以下參數,來實現對指定資源類型進行壓縮。
1 compression="on" # 打開壓縮功能 2 compressionMinSize="50" # 啓用壓縮的輸出內容大小,默認爲2KB 3 noCompressionUserAgents="gozilla, traviata" # 對於如下的瀏覽器,不啓用壓縮 4 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"# 哪些資源類型須要壓縮
若是使用apache/nginx代理,因此tomcat自身不須要進行壓縮,會給服務器增長壓力
默認的模式,性能很是低下,沒有通過任何優化處理和支持。
利用java的異步io護理技術,no blocking IO技術.
想運行在該模式下,直接修改server.xml裏的Connector節點,修改protocol爲
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" enableLookups="false" redirectPort="8443"/>
啓動後,就能夠生效。
安裝起來最困難,可是從操做系統級別來解決異步的IO問題,大幅度的提升性能.。必需要安裝apr和native,直接啓動就支持apr。
安裝APR
sudo yum -y install apr apr-devel tar zxvf tomcat-native.tar.gz //該文件在tomcat的bin目錄下面 cd tomcat-native-1.1.24-src/jni/native ./configure--with-apr=/usr/bin/apr-1-config make make install
安裝完成以後 會出現以下提示信息
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"
在Tomcat 配置文件 server.xml 中的 <Connector ... /> 配置中
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, 表示不限制創建客戶鏈接的時間
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" #nio 利用java的異步io護理技術,noblocking IO技術. 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" <!-- 前端使用nginx做爲反向代理,不須要啓用tomcat壓縮功能。 compression="on" #打開壓縮功能 compressionMinSize="2048" #啓用壓縮的輸出內容大小,這裏面默認爲2KB compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" #壓縮類型 --> redirectPort="8443"/>
Tomcat 安裝目錄下的lib目錄下,名稱爲 catalina.jar,直接修改catalina.jar中的文件,org/apache/catalina/util/ServerInfo.properties
server.info=Apache Tomcat/7.0.53
咱們線上是不使用 Tomcat 默認提供的管理頁面的,所以都會在初始化的時候就把這些頁面刪掉。這些頁面是存放在 Tomcat 安裝目錄下的webapps目錄下的。咱們只須要刪除該目錄下的全部文件便可。固然,還有涉及管理頁面的2個配置文件host-manager.xml 和 manager.xml 也須要一併刪掉。這兩個文件存放在 Tomcat 安裝目錄下的conf/Catalina/localhost目錄下。
爲了進一步安全,咱們不建議使用 root 來啓動 Tomcat。這邊建議使用專用用戶 tomcat 或者 nobody 用戶來啓動 Tomcat。在啓動以前,須要對咱們的tomcat 安裝目錄下全部文件的屬主和屬組都設置爲指定用戶。
爲了防止 Tomcat 被植入 web shell 程序後,能夠修改項目文件。所以咱們要將 Tomcat 和項目的屬主作分離,這樣子,即使被搞,他也沒法建立和編輯項目文件。
默認 Tomcat 是開啓了對war包的熱部署的。爲了防止被植入木馬等惡意程序,所以咱們要關閉自動部署。
修改實例:
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
server.xml中定義了能夠直接關閉 Tomcat 實例的管理端口。咱們經過 telnet 鏈接上該端口以後,輸入 SHUTDOWN (此爲默認關閉指令)便可關閉 Tomcat 實例(注意,此時雖然實例關閉了,可是進程仍是存在的)。因爲默認關閉Tomcat 的端口和指令都很簡單。默認端口爲8005,指令爲SHUTDOWN 。所以咱們須要將關閉指令修改複雜一點。
固然,在新版的 Tomcat 中該端口僅監聽在127.0.0.1上,所以你們也沒必要擔憂。除非黑客登錄到tomcat本機去執行關閉操做。
修改實例:
<Server port="8005"shutdown="9SDfjsd29jf24sdff0LSDdfJKS9DKkjsd">
在修改內核參數的時候,建議你們逐個設置,而後反覆試驗,切勿圖方便直接拿上就用,一次所有替換。
優化網絡參數
修改/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
步驟1:修改%tomcat安裝路徑%\conf \tomcat-users文件,配置admin設置權限。在<tomcat-users>中增長部份內容。具體以下:
<role rolename="manager-gui"/> <user username="manager"password="1234" roles="manager-gui"/>
注:用戶名:manager,密碼:1234
步驟2:完成後,啓動tomcat,輸入:http://localhost:8080 --(IP,端口號,可遠程訪問)
點擊status,輸入帳號,密碼(manager,1234),進入status,時時刷新頁面,查看當前tomcat狀態。 或者直接訪問:http://localhost:8080/manager/status頁面。
備註1:若但願整個服務器的性能數據以一個單行的xml文件形式表示,則進入以下界面:http://localhost:8080/manager/status?XML=true
備註2:若服務器中存在幾個項目,單獨對某個項目進行監控,則須要另行增長代碼。
Free memory: 304.84 MB Total memory: 903.00MB Max memory: 7273.00 MB
Free memory:空閒內存大小。
Total memory:總內存大小。
Max memory:最大內存大小。
Max threads: 200 Current thread count: 10Current thread busy: 1 Keeped alive sockets count: 1Max processing time: 187 msProcessing time: 0.281 s Request count: 32 Error count: 3 Bytes received: 0.00MB Bytes sent: 0.12 MB
Max threads:最大線程數。
Current thread count:最近運行的線程數。
Max processing time:最大CPU時間。
Processing time:CPU消耗總時間
Request count:請求總數。
Error count:錯誤的請求數。
Bytes received:接收字節數。
Bytes sent:發送字節數。
訪問地址:
curl --user manager:1234 http://you_tomcat_ip:port/manager/status?XML=true