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

tomcat配置調優與安全總結javascript

      做爲運維,避免不了與tomcat打交道,然而做者發現網絡上關於tomcat配置和調優安全的文章很是散,經過參考各位大神的相關技術文檔,根據做者對tomcat的運維經驗,總結了一些tomcat的基礎運維注意事項,但願對廣大技術兄弟們有些幫助。css

    本篇文章只是對tomcat模板的基礎調優,除了部署tomcat的各系統環境和配置,影響tomcat併發和性能的另外一大重要因素,就是java的代碼工程,而如何在生產中優化java工程,這個就須要運維與開發共同配合,尤爲是運維須要有開發與運維是同一個團隊的意識,只有雙方配合默契才能發揮最大戰力,要知道一我的的力量永遠是有限的,只有團隊合做才能爆發出真正力量!html

     而包含了Java工程的總體優化就設計到總體的架構優化,這個更加是一個細緻而有趣的過程,也是運維通向架構師的一個必經之路!前端

    

一、功能優化

  1.一、硬件資源對tomcat的影響

  做者實測,在阿里雲的不一樣區域部署相同系統應用配置的tomcat,在壓測時會出現吞吐量差別達到1/4,通過對比發現,兩個區域的cpu頻率2.2GHz和2.6Ghz。系統硬件性能直接影響tomcat的併發量,起決定做用的是CPU和MEM,CPU運行速度提高,會帶來tomcat響應時間的縮短,mem大小決定工程須要內存的大小和工程的併發數量。java

  1.2     Java虛擬機調優

    1.2.1     JDK版本選擇

       若是新手請選擇SUN的JVM,在知足項目須要的前提下,儘可能選用版本較高的JVM,通常來講高版本產品在速度和效率上比低版本會有改進。 JDK1.4比JDK1.3性能提升了近10%-20%,JDK1.5比JDK1.4性能提升25%-75%。 所以對性能要求較高的狀況推薦使用 JDK1.6nginx

     這裏須要補充的是,各位在打算升級JVM時,必定要先讓開發先試用高版本的JVM,調試高版本JVM對工程的影響,通過測試後逐步部署到測試環境,通過必定時間的驗證,發現沒有問題後再謹慎的更換到生產。JVM版本不一致,很容易出現各種異常,對待生產,謹慎永遠是第一原則!web

   JVM調優參見:http://vekergu.blog.51cto.com/9966832/1626733shell

    1.2.2     JDK參數優化

        Tomcat內存優化主要是對 tomcat 啓動參數優化,咱們能夠在 tomcat 的啓動腳本 catalina.sh 中設置 JAVA_OPTS參數。apache

    1.   JAVA_OPTS參數說明      

 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區比例,以達到目標系統規定的最低響應時>間或者收集頻率等,此值建議使用並行收集器時,一直打開。

 

 

 

    1.2.3     生產案例

        根據做者本人的經驗,生產環境須要肯定對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"

 


說明:

 

 

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.三、tomcat集羣之session共享

    1.3.1     基於tomcat集羣的session共享

       在{TOMCST_HOME}/conf/server.xml取消下面代碼註釋便可:

 

         

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

 

 

 

    1.3.2     基於memcached存儲session共享

       具體配置方法見:http://vekergu.blog.51cto.com/9966832/1672833

  1.4     站點的默認網頁、自定義錯誤頁面、禁止列目錄等功能

      這些功能開發會在工程的WEB-INF目錄下的web.xml中設置,運維瞭解下就好,者遇到相似問題能夠找到解決思路。

      1.4.1     默認主頁

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.4.2     自定義錯誤頁面

 
1 <error-page> 
2     <error-code>404</error-code> 
3     <location>/404.htm</location> 
4 </error-page>

 

 

      1.4.3     定義會話超時時間

 

1 <session-config>
2     <session-timeout>30</session-timeout>
3 </session-config>

 

 

 

 

      1.4.4     禁止列目錄

 

1 <init-param>
2     <param-name>listings</param-name>
3     <param-value>false</param-value>
4 </init-param

 

 

 

 

  1.5     管理AJP端口

        AJP是爲 Tomcat 與 HTTP 服務器之間通訊而定製的協議,能提供較高的通訊速度和效率。若是tomcat前端放的是apache的時候,會使用到AJP這個鏈接器。因爲咱們公司前端是由nginx作的反向代理,所以不使用此鏈接器,所以須要註銷掉該鏈接器。在          {TOMCST_HOME}/conf/server.xml中找到下列代碼,註釋便可

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

 

 

 

 

  1.6     取消默認gc監聽

        若是開啓了GClog,再開啓GC監聽,會影響GClog輸出,功能重複,能夠選擇取消。

1 <!--
2     <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
3 -->

  1.7   自定義tomcat代碼路徑

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,建議對這個參數認真對待,不然一不當心就是一個坑。。。。

 

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 節點中配置以下參數,來實現對指定資源類型進行壓縮。

 

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自身不須要進行壓縮,會給服務器增長壓力

  2.6     tomcat的三種運行模式選擇

    2.6.1     Bio

      默認的模式,性能很是低下,沒有通過任何優化處理和支持。

    2.6.2     Nio

      利用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"/>

 

 

 

  啓動後,就能夠生效。

    2.6.3     Apr

      安裝起來最困難,可是從操做系統級別來解決異步的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"

 

 

 

 

  2.7     Tomcat鏈接相關參數總結

在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, 表示不限制創建客戶鏈接的時間

  2.8     生產配置實例

<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"/>

3     安全優化

  3.1     tomcat隱藏版本信息

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包的熱部署的。爲了防止被植入木馬等惡意程序,所以咱們要關閉自動部署。

修改實例:

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

 

3.6     更改關閉 Tomcat 實例的指令

    server.xml中定義了能夠直接關閉 Tomcat 實例的管理端口。咱們經過 telnet 鏈接上該端口以後,輸入 SHUTDOWN (此爲默認關閉指令)便可關閉 Tomcat 實例(注意,此時雖然實例關閉了,可是進程仍是存在的)。因爲默認關閉Tomcat 的端口和指令都很簡單。默認端口爲8005,指令爲SHUTDOWN 。所以咱們須要將關閉指令修改複雜一點。

    固然,在新版的 Tomcat 中該端口僅監聽在127.0.0.1上,所以你們也沒必要擔憂。除非黑客登錄到tomcat本機去執行關閉操做。

      修改實例:

<Server port="8005"shutdown="9SDfjsd29jf24sdff0LSDdfJKS9DKkjsd">

 

 

 

 

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

 

5 tomcat監控

  5.1     配置tomcat的status狀態頁

步驟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

http://vekergu.blog.51cto.com/9966832/1672931

相關文章
相關標籤/搜索