Tomcat安全設置與優化詳解(非原創)

一、Tomcat簡介
二、Tomcat安全設置
三、Tomcat優化
四、參考文章

 

一、Tomcat簡介

Tomcat 是 Apache軟件基金會下的一個免費、開源的WEB應用服務器,它可以運行在 Linux 和 Windows 等多個平臺上,由於其性能穩定、擴展性好、免費等特點深受廣大用戶喜愛。目前,很多互聯網應用和企業應用都部署在 Tomcat 服務器上, 之前我們 tomcat 都採用的是默認的配置,因此在安全方面還是有所隱患的。tomcat默認參數是爲開發環境制定,而非適合生產環境,尤其是內存和線程的配置,默認都很低,容易成爲性能瓶頸。

 

Tomcat基礎操作包括以下內容

 

 

二、Tomcat安全設置

1. 版本安全

  升級當前的tomcat版本爲最新穩定版本。故名思議,最新穩定版本就要兼顧最新和穩定這兩個概念。一個穩定的版本,是需要時間沉澱的,而最新又是相對於穩定版而言的最新。因此我們一般會選擇當前大版本中,最新版本往前推幾個版本或者往前推幾個月出的版本。
  目前,企業常用的tomcat大版本爲6.0和7.0版本,8.0版本雖然已經出了很久了,但是仍然不建議使用。
在升級版本中,需要注意的事情有兩點:
(1)儘量避免跨大版本的升級
(2)將當前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件進行備份,然後部署完新版本的 tomcat 之後,將這些配置文件覆蓋過去即可,然後停掉舊版本,啓動新版本即可完成升級操作。

2. 隱藏版本信息

爲了避免黑客針對某些版本進行攻擊,因此我們需要隱藏或者僞裝 Tomcat 的版本信息。默認 Tomcat 的版本信息如下:

 

針對該信息的顯示是由一個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即可看到效果!效果如下:

 

3. 賬戶安全管理

優化配置之前,我們需要配置一個tomcat管理員賬戶,來登錄查看Tomcat控制檯提高的各種參數。
在conf/ tomcat-users.xml下添加用戶:

<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>

啓動tomcat,登錄查看信息:http://127.0.0.1:8080/

 

三、Tomcat優化

1. 簡介

服務器所能提供CPU、內存、硬盤的性能對處理能力有決定性影響,所以說服務器性能牛B,Tomcat也不會太差。當然提高服務器的硬件配置,是需要大量RMB的支持的。所以不到萬不得已不會採用這種方式,一般公司會採取下面這種通過優化配置,來提升Tomcat性能的方式。

2. tomcat的3種運行模式

2.1 bio
默認的模式,性能非常低下,沒有經過任何優化處理和支持.

2.2 nio
nio(new I/O),是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的併發運行性能。

2.3 apr
安裝起來最困難,但是從操作系統級別來解決異步的IO問題,大幅度的提高性能
Tomcat apr模式也是Tomcat在高併發下的首選運行模式。

3. 併發優化(線程池)

在tomcat中每一個用戶請求都是一個線程,所以可以使用線程池提高性能。開啓並且使用配置:

 

在Connector中指定使用共享線程池

 

查看Tomcat控制檯

 

Executor重要參數說明
(1)name:共享線程池的名字。這是Connector爲了共享線程池要引用的名字,該名字必須唯一。默認值:None;
(2)namePrefix:在JVM上,每個運行線程都可以有一個name 字符串。這一屬性爲線程池中每個線程的name字符串設置了一個前綴,Tomcat將把線程號追加到這一前綴的後面。默認值:tomcat-exec-;
(3)maxThreads:該線程池可以容納的最大線程數。默認值:200;
(4)maxIdleTime:在Tomcat關閉一個空閒線程之前,允許空閒線程持續的時間(以毫秒爲單位)。只有當前活躍的線程數大於minSpareThread的值,纔會關閉空閒線程。默認值:60000(一分鐘)。
(5)minSpareThreads:Tomcat應該始終打開的最小不活躍線程數。默認值:25。
(6)threadPriority:線程的等級。默認是Thread.NORM_PRIORITY
(7)executor:表示使用該參數值對應的線程池;
(8)minProcessors:服務器啓動時創建的處理請求的線程數;
(9)maxProcessors:最大可以創建的處理請求的線程數;
(10)acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理

參數最佳實踐一

 
 

注意:線程池指定Web請求負載的數量,因此,爲獲得更好的性能這部分應小心處理。可以通過調整連接器屬性“maxThreads”完成設置。maxThreads的值應該根據流量的大小,如果值過低,將有沒有足夠的線程來處理所有的請求,請求將進入等待狀態,只有當一個的處理線程釋放後才被處理;如果設置的太大,Tomcat的啓動將花費更多時間。因此它取決於我們給maxThreads設置一個正確的值下載地址

在上述配置中,maxThreads值設定爲“250”,這指定可以由服務器處理的併發請求的最大數量。如果沒有指定,這個屬性的默認值爲“200”。任何多出的併發請求將收到“拒絕連接”的錯誤提示,直到另一個處理請求進程被釋放。錯誤看起來如下,

如果應用提示上述錯誤,務必檢查上述錯誤是否是由於單個請求花費太長時間造成的,這個問題的原因是這樣的,有時候如果數據庫連接不釋放的話,進程將不會處理其它請求。

注意: 如果請求的數量超過了“750”,這將不是意味着將maxThreads屬性值設置爲“750”,它意外着最好使用“Tomcat集羣”的多個實例。也就是說,如果有“1000”請求,兩個Tomcat實例設置“maxThreads= 500”,而不在單Tomcat實例的情況下設置maxThreads=1000。

參數最佳實踐二

<Connector port="8080" protocol="HTTP/1.1"
           maxThreads="1000"
           minProcessors="100"
           maxProcessors="1000"
           minSpareThreads="100"
           maxSpareThreads="1000"
           enableLookups="false"
           URIEncoding="utf-8"
           acceptCount="1000"
           connectionTimeout="20000"
           disableUploadTimeout="ture"
           redirectPort="8443" />

4. 禁用AJP連接器

AJP(Apache JServer Protocol)AJPv13協議是面向包的。WEB服務器和Servlet容器通過TCP連接來交互;爲了節省SOCKET創建的昂貴代價,WEB服務器會嘗試維護一個永久TCP連接到servlet容器,並且在多個請求和響應週期過程會重用連接。

 

我們一般是使用Nginx+tomcat的架構,所以用不着AJP協議,所以把AJP連接器禁用。

 

在管理界面中看不到ajp了:

 

當用nginx和tomcat做企業級集羣的時候,需要禁用掉AJP協議,不是時候,最好不要關閉,因爲當tomcat與其他服務器集成時候,需要用到AJP。

5. 提高JVM棧內存

你使用過tomcat的話,簡單的說就是“內存溢出”. 通常情況下,這種問題出現在實際的生產環境中.產生這種問題的原因是tomcat使用較少的內存給進程,通過配置TOmcat的配置文件(Windows 下的catalina.bat或Linux下的catalina.sh)可以解決這種問題.這種解決方法是通過增加JVM的棧內存實現的.也就是說,JVM通常不去調用垃圾回收器,所以服務器可以更多關注處理web下載地址請求,並要求儘快完成。要更改文件(catalina.sh) 位於"\tomcat server folder\bin\catalina.sh",下面,給出這個文件的配置信息。

-Xms – 指定初始化時化的棧內存
-Xmx – 指定最大棧內存

在重啓你的Tomcat服務器之後,這些配置的更改纔會有效。

6. 壓縮文件

(1)Tomcat有一個通過在server.xml配置文件中設置壓縮的選項。壓縮可以在connector像如下設置中完成下載地址
(2)在前面的配置中,當文件的大小大於等於500bytes時纔會壓縮。如果當文件達到了大小但是卻沒有被壓縮,那麼設置屬性compression="on"。否則Tomcat默認設置是“off”。

7. 分離 Tomcat 和項目的用戶

爲了防止 Tomcat 被植入 web shell 程序後,可以修改項目文件。因此我們要將 Tomcat 和項目的屬主做分離,這樣子,即便被搞,他也無法創建和編輯項目文件。

8. 禁用DNS查詢

當web應用程序向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過域名服務器查找機器名 轉換爲IP地址。
DNS查詢需要佔用網絡,並且包括可能從很多很遠的服務器或者不起作用的服務器上去獲取對應的IP的過程,這樣會消耗一定的時間。
修改server.xml文件中的Connector元素,修改屬性enableLookups參數值: enableLookups="false"
如果爲true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址

9. 其他選項

(1)開啓瀏覽器的緩存,這樣讀取存放在webapps文件夾裏的靜態內容會更快,大大推動整體性能。
(2)每當開機時,Tomcat服務器應當自動地重啓。
(3)一般情況下HTTPS請求會比HTTP請求慢。如果你想要更好的安全性,即使慢一點我們還是要選擇HTTPS。

四、參考文章

    1. https://www.cnblogs.com/xyd51cto/p/7718462.html
    2. https://blog.csdn.net/u010195563/article/details/80966025
    3. https://blog.csdn.net/huiyunfei/article/details/79165120
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章