Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個servelet容器,按照Sun microsystems提供的技術
規範開發出來,Tomcat 8實現了對servlet 3.1和Javaserver page 2.3(JSP)的支持,並提供了做爲web服務器的
一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat附加組件等php
安裝jdk和apache
html
多實例(一個主機運行多個Tomcat)java
查看
JPS命令功能描述:jps是用於查有權限訪問的hotspot虛擬機(jdk中帶的虛擬機)的進程
命令語法: jps [options] [hostid]
options:命令選項,用來對輸出格式進行控制
-p 僅僅顯示vm標識,不顯示jar,class,main參數等信息
-m 輸出主函數傳入的參數
-l 輸出應用程序主類完整package名稱或jar完整名稱
-v 列出jvm參數,-Xms20m -Xmx50m是啓動程序指定的jvm參數與
-V 輸出經過.hotsportrc或者-XX:Flags=<filename>指定的jvm參數
hostid:指定特定主機,可使IP地址或域名,也能夠指定具體協議,端口 [protocol:][//hostname][:port]
[servername]web
配置
目錄結構
程序目錄
——Tomcat執行腳本目錄 conf ——Tomcat配置文件 lib ——Tomcat運行須要的庫文件(JARS) logs ——
Tomcat執行時的LOG文件 temp ——Tomcat臨時文件存放目錄 webapps ——Tomcat的主要Web發佈目錄(存
放咱們本身的JSP,SERVLET,類) work ——Tomcat的工做目錄,Tomcat將翻譯JSP文件到的Java文件和class文件
放在這裏
web工程發佈目錄結構 webapps是
Tomcat的主要Web發佈目錄,默認狀況下把Web應用文件放於此目錄 項目名: 項目名下面有WEB-INF ,
META-INF,兩個文件夾,和一些給瀏覽器訪問的資源,如html文件;
WEB-INF:能夠稱爲是安全目錄,由於在這下面的文件,瀏覽器是訪問不到的,數據庫
默認webapps目錄結構
docs:Tomcat幫助文檔 examples:web應用實例 host-manager:主機管理 manager:應用管理 ROOT:默認站點根
目錄
配置文件
conf目錄主要是用來存放tomcat的一些配置文件。
server.xml 主配置文件 web.xml 與其餘適用於整個web應用程序設置的配置文件 context.xml 默認的context設
置,應用於安裝了Tomcat的全部主機的全部部署內容 tomcat-users.xml用來配置管理tomcat的用戶與權限
catalina.xml Tomcat的安全防禦策略文件
組件apache
自定義目錄
修改server.xml文件中的host元素 #appBase 定義站點目錄 #docBase 定義應用目錄 #Context path 指出你的訪
問路徑(虛擬應用名,可爲空) #Context docBase 指定你的存放路徑 #debug 爲設定dedug的登記,0提供最
少的信息,9提供最多的信息 #reloadable=true 當web.xml或者class有改動的是後續都會自動更新加載,不須要
重新啓動服務 #crosscontext="true" 表示配置的不一樣context共享一個session #unpackWARs 是否自動解壓war
包 #autoDeploy 是否自動部署(熱部署)
appBase 這個目錄表示: 這個目錄下面的子目錄將自動被部署爲應用(autoDeploy="true") 這個目錄下的war
文件將被自動解壓縮並部署爲應用(unpackWARs="true") 這個目錄下的子目錄,會當作單獨的虛擬目錄,或
者叫應用 若是不想使用Tomcat下的webapp目錄路,則appBase下面加一行docBase,把路徑配置到docBase
中,把appBase爲空就能夠了編程
自定義目錄vim
自定義一個監控頁面,經過web查看運行性能(相似phpinfo) server.xml以下設置後端
遠程監控
Tomcat開啓JMX遠程調試功能瀏覽器
查看端口
6.測試
後臺
app manager
作這個的時候要把catalina.sh裏邊寫入的東西刪除掉,不然Tomcat沒法訪問到頁面
查看端口
測試
測試
(1)
(2)
熱部署
tomcat的熱部署實現原理:tomcat啓動的時候會有啓動一個線程每隔一段時間會去判斷應用中加載的類是否發生
變法(類總數的變化,類的修改),若是發生了變化就會把應用的啓動線程中止掉,清除引用,而且把加載該應
10-Tomcat.md 5/12/2019
18 / 23
用的WebappClassLoader設爲null,而後建立一個新的WebappClassLoader來從新加載應用。
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
reloadable的做用是當你修改了jsp以後會自動編譯class文件,等於即時生效,可是代價不低,適合本地
開發調試,通常在開發階段將reloadable的屬性設置爲true,有助於調試servlet和其餘的class文件,可是
因爲這樣會增長服務器的運行負載,損耗系統性能,在項目運行階段將它設置爲false
war包部署
直接將web項目文件(通常是複製生成的war包)複製到Tomcat的webapps目錄
若是Tomcat沒有開啓自解壓,則將war包解壓到webapps目錄
解壓命令jar(解壓到當前目錄) jar -xf bdqnweb.war war包也可使用unzip解壓,使用unzip命令的時候,可
以指定解壓目錄
安全
端口防禦
修改目標端口爲不易猜想的端口,下降自動掃描軟件發現到的概率
後臺管理
刪除默認的管理後臺(若是不須要使用),下降被爆破和提權的風險
刪除webapp下的host-manager和manager目錄
禁用目錄瀏覽
修改 conf/web.xml文件,將listings改成false
隱藏信息
儘可能避免暴露服務器的版本信息,隱藏錯誤頁面。在配置中對一些常見的錯誤進行重定向,避免出現錯誤時
Tomcat默認顯示的錯誤頁面暴露服務器和版本信息;必須確保程序根目錄下的錯誤頁面已經存在;
vim conf/web.xml
添加內容
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
重啓Tomcat,測試一下
firefox 192.168.43.249:8088/aaaaaaaaaaaaaaa
注意:這裏的意思是說,若是是404的錯誤就找/目錄下的notfound.jsp,因此必定要知道本身的網頁根目錄在哪,並在這個目錄下建立notfound.jsp頁面,頁面內容本身編輯 網頁根目錄是server.xml文件中 host 標籤下的context標籤裏的docBase
上邊web.xml中只寫了404報錯的,其餘常見報錯也能夠寫,好比
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>
腳本權限收回
去除其餘用戶對Tomcat的bin目錄下的 shutdown.sh、startup.sh、catalina.sh的可執行權限,防止其餘用戶有
Tomcat的權限 chmod -R 744 /usr/local/apache-tomcat-8.5.35/bin/
日誌規範
開啓Tomcat默認訪問日誌中的referer和user-agent記錄,開啓這兩個是爲了一旦出現安全問題,可以更好的根
據日誌進行問題排查
[root@localhost apache-tomcat-8.5.35]# vim conf/server.xml
原來是這樣:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
10-Tomcat.md 5/12/2019
20 / 23
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
修改後的樣子:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" />
主機管理器的使用 (末尾添加)
<role rolename="admin-gui"/>
<user username="xgp" password="123.com" roles="admin-gui"/>
瀏覽器測試
日誌切割使用cronolog
重啓tomcat
定義錯誤頁面
線程池優化
2.重啓tomcat
Tomcat優化
1 /usr/local/tomcat/bin/catalina.sh 開頭添加
JAVA_OPTS="-Dfile.encoding=UTF-8
-server
-Xms1024M
-Xmx1024M
-XX:NewSize=512M
-XX:MaxNewSize=1024M
-XX:PermSize=256M
-XX:MaxPermSize=356M
-XX:NewRatio=2
-XX:ParallelGCThreads=15
-XX:+DisableExplicitGC"
-Xms:表示 JVM初始內存大小,也能夠說是Java 初始化堆的大小,-Xms 與-Xmx 設成同樣的值,避免 JVM 反覆從新申請內存,致使性能大起大落,默認值爲物理內存的 1/64
-Xmx:表示最大 Java 堆大小,當應用程序須要的內存超出堆的最大值時虛擬機就會提示內存溢出,而且致使應用服務崩潰,所以通常建議堆的最大值設置爲可用內存的最大值的80%。
-Xmn:設置JVM最小內存(128-256就夠了,通常不設置)
-XX:NewSize:設置新生代內存大小。 新生代,對象新建立的時候分配的內存空間,老生代在垃圾回收器回收事後該對象依然沒有被回收,該對象就會移動到老生代
-XX:PermSize:設置持久代內存大小,用於存放靜態文件,現在Java類、方法等。持久代對垃圾回收沒有顯著影響,可是有些應
用可能動態生成或者調用一些class,持久帶也稱爲方法區,方法區存儲每個java類的結構信息:好比運行時常量池,字段和方法數據,構造函數和普通方法的字節碼內容以及類、實例、接口初始化時須要使用到的特殊方法等數據,JDK8中已經把持久代(PermGen Space) 幹掉了,取而代之的元空間(Metaspace)。Metaspace佔用的是本地內存,再也不佔用虛擬機內存。
-XX:MaxPermSize:設置最大值持久代內存大小,永久代不屬於堆內存,堆內存只包含新生代和老年代
-XX:NewRatio:改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認爲8)
-XX:ParallelGCThreads 可用來增長並行度,須要多cpu
-XX:+DisableExplicitGC:關閉System.gc(),簡單理解就是關閉java中的內存回收機制
2.重啓tomcat
Tomcat的請求方式
Tomcat支持三種接收請求的方式:BIO NIO APR
一、BIO:每一個請求都要建立一個線程來處理,線程開銷比較大,不適用高併發的場景,性能也最低
二、NIO:基於緩衝區,能提供非阻塞I/O操做,和傳統的BIO相比,具有更好的併發性能
三、APR(Apache portable run-time libraries):簡單理解,就是從操做系統級別解決異步IO問題,大幅度的提升服務器的處理和相應性能,也是Tomcat運行高併發的首選模式
APR提供的主要功能模塊包括:內存分配及內存池、原子操做、文件I/O、鎖、內存映射、哈希表、網絡I/O、輪詢、進程及線程操做等等,經過採用APR,Tomcat能夠得到高度可擴展性以及優越的性能,而且能夠更好的與本地服務器技術集成,從而可使Tomcat做爲一款通用的Web服務器使用,而不只僅做爲輕量級應用服務器。在這種狀況下,Java將再也不是一門側重於後端的編程語言,也能夠更多的用於成熟的Web服務器平臺。
Excutor重要參數說明: