1、Tomcat簡介
2、Tomcat安全設置
3、Tomcat優化
4、參考文章html
1、Tomcat簡介
Tomcat 是 Apache軟件基金會下的一個免費、開源的WEB應用服務器,它能夠運行在 Linux 和 Windows 等多個平臺上,因爲其性能穩定、擴展性好、免費等特色深受廣大用戶喜好。目前,不少互聯網應用和企業應用都部署在 Tomcat 服務器上, 以前咱們 tomcat 都採用的是默認的配置,所以在安全方面仍是有所隱患的。tomcat默認參數是爲開發環境制定,而非適合生產環境,尤爲是內存和線程的配置,默認都很低,容易成爲性能瓶頸。java
Tomcat基礎操做包括如下內容linux
2、Tomcat安全設置
1. 版本安全
升級當前的tomcat版本爲最新穩定版本。故名思議,最新穩定版本就要兼顧最新和穩定這兩個概念。一個穩定的版本,是須要時間沉澱的,而最新又是相對於穩定版而言的最新。所以咱們通常會選擇當前大版本中,最新版本往前推幾個版本或者往前推幾個月出的版本。
目前,企業經常使用的tomcat大版本爲6.0和7.0版本,8.0版本雖然已經出了好久了,可是仍然不建議使用。
在升級版本中,須要注意的事情有兩點:
(1)儘可能避免跨大版本的升級
(2)將當前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件進行備份,而後部署完新版本的 tomcat 以後,將這些配置文件覆蓋過去便可,而後停掉舊版本,啓動新版本便可完成升級操做。nginx
2. 隱藏版本信息
爲了不黑客針對某些版本進行攻擊,所以咱們須要隱藏或者假裝 Tomcat 的版本信息。默認 Tomcat 的版本信息以下:web
針對該信息的顯示是由一個jar包控制的,該jar包存放在 Tomcat 安裝目錄下的lib目錄下,名稱爲 catalina.jar。咱們能夠經過 jar xf 命令解壓這個 jar 包會獲得兩個目錄 META-INF 和 org ,經過修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段來實現來更改咱們tomcat的版本信息。文件信息以下:shell
[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下添加用戶:apache
<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/vim
3、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。