Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個servelet容器,按照Sun microsystems提供的技術
規范開發出來,Tomcat 8實現了對servlet 3.1和Javaserver page 2.3(JSP)的支持,并提供了作為web服務器的
一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat附加組件等
安裝jdk和apache
export JAVA_H0ME=/usr/local/jdk1.8.0_211
export JRE_HOME=/usr/local/jdk1.8.0_211
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_H0ME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
刷新一下 source /etc/profile
查看一下 java -version
多實例(一個主機運行多個Tomcat)
查看
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]
配置
目錄結構
程序目錄
——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的安全防護策略文件
組件
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener"
SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
/>
<Listener
className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"
/>
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
engine是核心組件,負責通過connector接收用戶請求,并處理請求,將請求轉發至對應的虛擬主機host上,
defaulthost指定缺省的處理請求的主機名,它至少與其中呢一個host元素的name屬性值是一樣的 realm表示存
放用戶名、密碼及role的數據庫
Tomcat Server處理一個http請求的過程 假設來自客戶的請求為: http://localhost:8080/wsota/wsota_index.jsp
請求被發送到本機端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得 Connector把該請求交給它所在
的Service的Engine來處理,并等待來自Engine的回應 Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它
所擁有的所有虛擬主機Host Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為
該Host被定義為該Engine的默認主機) localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有
Context Host匹配到路徑為/wsota的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet Context匹配到
URL PATTERN為*.jsp的servlet,對應于JspServlet類 構造HttpServletRequest對象和HttpServletResponse對象,
作為參數調用JspServlet的doGet或doPost方法 Context把執行完了之后的HttpServletResponse對象返回給Host
Host把HttpServletResponse對象返回給Engine Engine把HttpServletResponse對象返回給Connector Connector
把HttpServletResponse對象返回給客戶browser
自定義目錄
修改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為空就可以了
自定義目錄
[root@bogon ~]# mkdir -p /data/project
[root@bogon ~]# vim /data/project/index1.jsp
[root@bogon ~]# vim /data/project/index2.jsp
自定義一個監控頁面,通過web查看運行性能(類似phpinfo) server.xml如下設置
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;
out.println("JVM memory detail info :<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Total memory: "+tm+"MB"+"<br>");
out.println("Free memory: "+fm+"MB"+"<br>");
out.println("Available memmory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
%>
遠程監控
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
1、BIO:每個請求都要創建一個線程來處理,線程開銷比較大,不適用高并發的場景,性能也最低
2、NIO:基于緩沖區,能提供非阻塞I/O操作,和傳統的BIO相比,具備更好的并發性能
3、APR(Apache portable run-time libraries):簡單理解,就是從操作系統級別解決異步IO問題,大幅度的提高服務器的處理和相應性能,也是Tomcat運行高并發的首選模式
APR提供的主要功能模塊包括:內存分配及內存池、原子操作、文件I/O、鎖、內存映射、哈希表、網絡I/O、輪詢、進程及線程操作等等,通過采用APR,Tomcat可以獲得高度可擴展性以及優越的性能,并且可以更好的與本地服務器技術集成,從而可以使Tomcat作為一款通用的Web服務器使用,而不僅僅作為輕量級應用服務器。在這種情況下,Java將不再是一門側重于后端的編程語言,也可以更多的用于成熟的Web服務器平臺。
Excutor重要參數說明:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。