Tomcat安全配置與性能優化

本文轉載:http://nolinux.blog.51cto.com/4824967/1608940 

Tomcat 是 Apache軟件基金會下的一個免費、開源的WEB應用服務器,它可以運行在 Linux 和 Windows 等多個平臺上,由於其性能穩定、擴展性好、免費等特點深受廣大用戶喜愛。目前,很多互聯網應用和企業應用都部署在 Tomcat 服務器上

一、版本安全

       升級當前的tomcat版本爲最新穩定版本。故名思議,最新穩定版本就要兼顧最新和穩定這兩個概念。一個穩定的版本,是需要時間沉澱的,而最新又是相對於穩定版而言的最新。因此我們一般會選擇當前大版本中,最新版本往前推幾個版本或者往前推幾個月出的版本。

       目前,企業常用的tomcat大版本爲6.0和7.0版本,8.0版本雖然已經出了很久了,但是仍然不建議使用。

       在升級版本中,需要注意的事情有兩點:

       1、儘量避免跨大版本的升級

       2、將當前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件進行備份,然後部署完新版本的 tomcat 之後,將這些配置文件覆蓋過去即可,然後停掉舊版本,啓動新版本即可完成升級操作。


二、隱藏版本信息

       爲了避免***針對某些版本進行***,因此我們需要隱藏或者僞裝 Tomcat 的版本信息。

       默認 Tomcat 的版本信息如下:

wKioL1WX7dHyA_9kAACOAD7Ko2A995.jpg

針對該信息的顯示是由一個jar包控制的,該jar包存放在 Tomcat 安裝目錄下的lib目錄下,名稱爲 catalina.jar。

我們可以通過 jar xf 命令解壓這個 jar 包會得到兩個目錄 META-INF 和 org ,通過修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段來實現來更改我們tomcat的版本信息。

文件信息如下:

[root@localhost ~]#  cat org/apache/catalina/util/ServerInfo.properties |grep -v '^$|#'
server.info=Apache Tomcat/7.0.53
server.number=7.0.53.0
server.built=Mar 25 2014 06:20:16
當然,還有另外一種方法來實現隱藏或僞裝Tomcat的版本信息,不過本質和上面一樣,操作如下:
[root@localhost ~]# cd /usr/local/apache-tomcat-7.0.53/lib
[root@localhost lib]# mkdir -p org/apache/catalina/util
[root@localhost lib]# cd org/apache/catalina/util
[root@localhost util]# vim ServerInfo.properties
server.info=nolinux        # 如果想修改成其它版本號,把這個地方的值改成其它值就行了

修改完畢之後,重啓 Tomcat即可看到效果!

效果如下:

wKioL1WX7jeyM1WaAAB8P0rAUVE465.jpg

三、優化 web.xml

        servlet與其它適用於整個Web應用程序設置的配置文件,必須符合servlet規範的標準格式。通過它可以配置你web應用的相關選項,tomcat在啓動的時候會讀取這個文件,完成你開發的系統的一些初始化操作。

它可以做如下事情: 

        1、提供基於 servlet 的相關配置

        2、增加監聽器,監控session或在tomcat啓動時,加載一些你希望加載的資源。比如創建數據庫連接池等等

        3、設置session過期時間,tomcat默認是30分鐘

        4、更改應用的默認網頁,常用爲index.html/index.jsp等

        5、增加過濾器,做一些你希望的過濾操作,比如敏感詞彙的過濾

        6、增加一些 jstl(標準標籤庫)的定義,方便在jsp中直接includ進來,直接使用這些標籤

        7、struts,spring或hibernate的一些配置等等

   如果沒有WEB-INF/web.xml文件,tomcat會輸出找不到的消息,但仍然會部署並使用web應用程序,不過通常最好還是讓每一個上線的web應用程序都有一個自己的 WEB-INF/web.xml,即使它只用做識別,但這是一個好的習慣。

       由於Servlet規範主要是對於web程序員,而非系統管理員使用的。因此,對於運維來講,我們可能更關心的是站點的默認網頁、自定義錯誤頁面、禁止列目錄等功能。

       在正常生產環境中,肯定不會直接由tomcat對公網提供服務,前端肯定放的有apache或者nginx。因此,針對站點的默認主頁和自定義錯誤頁面,我們均在前端的apache或者nginx中做。另外,公司也可能交由程序猿在項目內的WEB-INF/web.xml中去做定義。

       在tomcat新版本中,自動默認已經禁止列目錄功能。

       下面,我列出幾種常見功能,在web.xml中的表現形式:

站點默認主頁:

wKiom1THgX2yR-5kAACrCs_ImBs054.jpg

自定義錯誤頁面:

spacer.gifwKioL1THglzzidkDAACeimCxejE470.jpg

定義會話超時時間:

spacer.gifwKiom1THgX7gU_c9AABUIfdPmYE558.jpg

禁止列目錄:

spacer.gifwKioL1THgl2goCXFAAFWSl0ysxs201.jpg


四、優化 tomcat-user.xml

       該文件含有用戶名、角色以及密碼的清單文件。負責提供webapps下manager項目的登錄認證管理。

       在生產環境中,我們需要將該文件全部註釋。

       註釋效果如下:

spacer.gifwKiom1THgX6zBiIKAAI3e77oT-w339.jpg



五、優化 server.xml

       Tomcat的主配置文件,該文件中包含很多主要元素,比如Service、Connector、Host等,這些元素都會創建軟件"對象"、排序及進程管道中設置的這些元素嵌套方,使我們可以執行過濾、分組等工作。

       如果要對改文件做優化,我們需要先了解該文件的結構!

       server.xml的結構圖:

wKiom1THgX6CdvJRAADYw0nW4Dw501.jpg

    該文件描述瞭如何啓動Tomcat Serve

<Server>
    <Listener />
    <GlobaNamingResources>
    </GlobaNamingResources
    <Service>
        <Connector />
        <Engine>
            <Logger />
            <Realm />
               <host>
                   <Logger />
                   <Context />
               </host>
        </Engine>
    </Service>
</Server>

1、maxThreads 連接數限制

       maxThreads 是 Tomcat 所能接受最大連接數。一般設置不要超過8000以上,如果你的網站訪問量非常大可能使用運行多個Tomcat實例的方法,即,在一個服務器上啓動多個tomcat然後做負載均衡處理。

這裏還需要注意的一點是,tomcat 和 php 不同。php可以按照cpu和內存的情況去配置連接數,上萬很正常。而 java 還需要注意 jvm 的參數配置。如果不注意就會因爲jvm參數過小而崩潰。

2、多虛擬主機

       強烈建議不要使用 Tomcat 的虛擬主機,推薦每個站點使用一個實例。即,可以啓動多個 Tomcat實例,而不是啓動一個 Tomcat 裏面包含多個虛擬主機。因爲 Tomcat是多線程,共享內存,任何一個虛擬主機中的應用崩潰,都會影響到所有應用程序。雖然採用多實例的方式會產生過多的開銷,但至少保障了應用程序 的隔離和安全。

3、壓錯傳輸

       tomcat作爲一個應用服務器,也是支持 gzip 壓縮功能的。我們可以在 server.xml 配置文件中的 Connector 節點中配置如下參數,來實現對指定資源類型進行壓縮。

  compression="on"             # 打開壓縮功能    compressionMinSize="50"      # 啓用壓縮的輸出內容大小,默認爲2KB 
   noCompressionUserAgents="gozilla, traviata"      # 對於以下的瀏覽器,不啓用壓縮 
   compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些資源類型需要壓縮

提示:

       Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程 HTML、CSS、Javascript和Text,它可以節省40% 左右的流量。更爲重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。但是,壓縮會增加 Tomcat 的負擔,因此最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,將壓縮的任務交由 Nginx/Apache 去做。

4、管理AJP端口

       AJP是爲 Tomcat 與 HTTP 服務器之間通信而定製的協議,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個連接器。由於我們公司前端 是由nginx做的反向代理,因此不使用此連接器,因此需要註銷掉該連接器。

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

5、更改關閉 Tomcat 實例的指令

       server.xml中定義了可以直接關閉 Tomcat 實例的管理端口。我們通過 telnet 連接上該端口之後,輸入 SHUTDOWN (此爲默認關閉指令)即可關閉 Tomcat 實例(注意,此時雖然實例關閉了,但是進程還是存在的)。由於默認關閉 Tomcat 的端口和指令都很簡單。默認端口爲8005,指令爲SHUTDOWN 。因此我們需要將關閉指令修改複雜一點。

       當然,在新版的 Tomcat 中該端口僅監聽在127.0.0.1上,因此大家也不必擔心。除非***登陸到tomcat本機去執行關閉操作。

       修改實例:

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

6、更改 Tomcat 的服務監聽端口

       一般公司的 Tomcat 都是放在內網的,因此我們針對 Tomcat 服務的監聽地址都是內網地址。

       修改實例:

<Connector port="8080" address="172.16.100.1" />

7、關閉war自動部署

       默認 Tomcat 是開啓了對war包的熱部署的。爲了防止被植入***等惡意程序,因此我們要關閉自動部署。

       修改實例:

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

六、禁用 Tomcat 管理頁面

       一般線上是不使用 Tomcat 默認提供的管理頁面的,因此都會在初始化的時候就把這些頁面刪掉。這些頁面是存放在 Tomcat 安裝目錄下的webapps目錄下的。

       我們只需要刪除該目錄下的所有文件即可。

       當然,還有涉及管理頁面的2個配置文件 host-manager.xml 和 manager.xml 也需要一併刪掉。這兩個文件存放在 Tomcat 安裝目錄下的conf/Catalina/localhost目錄下。

七、linux內核的優化

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 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 6553

保存退出,執行sysctl -p生效。


八、服務器資源配置優化

九、配置參數優化

tomcat中如何禁止和允許主機或IP地址訪問

<Host name="localhost" ...> 
  ... 
  <Valve className="org.apache.catalina.valves.RemoteHostValve" 
         allow="*.mycompany.com,www.yourcompany.com"/> 
  <Valve className="org.apache.catalina.valves.RemoteAddrValve" 
         deny="192.168.1.*"/> 
  ... 
</Host>

編輯tomcat安裝目錄下的conf目錄下的server.xml文件

enableLookups: 是否反查域名,默認值爲true。爲了提高處理能力,應配置爲false

在tomcat配置文件server.xml中的<Connector />配置中,和連接數相關的參數有:

maxThreads="150"    #表示最多同時處理150個連接線程請求。這個值表示Tomcat可創建最大的線程數。默認值200。   
minSpareThreads="25"     表示即使沒有人使用也開這麼多空線程等待。
maxSpareThreads="75"     表示如果最多可以空75個線程,例如某時刻有80人訪問,之後沒有人訪問了,則tomcat不會保留80個空線程,而是關閉5個空的。 (一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。默認值50)
acceptCount="100"   當同時連接的人數達到maxThreads時,還可以接收排隊的連接數量,超過這個連接的則直接返回拒絕連接。(默認值100 )

其中和最大連接數相關的參數爲maxThreads和acceptCount。如果要加大併發連接數,應同時加大這兩個參數。
web server允許的最大連接數還受制於操作系統內核參數設置,通常Windows是2000個左右,Linux是1000個左右。

當然這些值都不是越大越好,需要根據實際情況來設定。可以基於測試的基礎上來不斷的調優分析。

<Connectorport="8080"   
          protocol="org.apache.coyote.http11.Http11NioProtocol"  
          connectionTimeout="20000"
           redirectPort="8443"   
           maxThreads="5000"   
           minSpareThreads="20"  
           acceptCount="1000"
          disableUploadTimeout="true"
           enableLookups="false"   
           URIEncoding="UTF-8" />

bufferSize: 輸入流緩衝大小,默認值2048 bytes。 
compression: 壓縮傳輸,取值on/off/force,默認值off。

connnectionTimeout: 網絡連接超時,默認值60000,單位:毫秒。配置爲0表示永不超時,這樣配置有隱患的。通常可配置爲30000毫秒。 

maxKeepAliveRequests:nginx動態的轉給tomcat,nginx是不能keepalive的,而tomcat端默認開啓了keepalive,會等待keepalive的timeout,默認不設置就是使用connectionTimeout。
所以必須設置tomcat的超時時間,並關閉tomcat的keepalive。否則會產生大量tomcat的socket timewait。

vim /tomcat/conf/server.xml

<Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1" 
           connectionTimeout="30000" maxKeepAliveRequests="1" 
           redirectPort="8443" bufferSize="8192" sockedBuffer="65536" acceptCount="200"/>
           
           其中maxKeepAliveRequests="1" 表示每個連接只響應一次就關閉,這樣就不會等待timeout了。

Catalina.sh JVM參數優化

linux 下編輯tomcat安裝目錄下的bin目錄下的catalina.sh文件,windows下爲catalina.bat

Catalina.sh添加如下內容:

CATALINA_OPTS="$CATALINA_OPTS–Xms 4000M –Xmx 4000M –Xmn 1000M -
XX:SurvivorRatio=4-XX:+UseConcMarkSweepGC -
XX:CMSInitiatingOccupancyFraction=82-DLOCALE=UTF-16LE  -DRAMDISK=/-
DUSE_RAM_DISK=ture -DRAM_DISK=true"

- Xms爲tomcat啓動初始內存,一般爲服務器開機後可用空閒內存減去100M

- Xmx爲tomcat最大佔用內存,一般爲服務器開機後可用空閒內存減去50M

一般說來,您應該使用物理內存的 80% 作爲堆大小。Tomcat默認能夠使用的內存爲128MB,在較大型的應用項目中,這點內存是不夠的,需要調大。 

說明:以上兩個參數關係到tomcat承受的訪問性能,但也要根據服務器實際內存情況設定。


配置多個tomcat實例,方法也很簡單,只需要在服務器上cp多個tomcat,然後修改三個端口和發佈目錄即可,然後分別啓動即可。

爲了提升整個網站的性能,還需要在tomcat前面架設nginx 或者apache反向代理服務器,用以提高用戶高速訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章