3. Tomcat 的文件結(jié)構(gòu)和組成
3.1 目錄結(jié)構(gòu)
| 目錄 | 說明 |
|---|---|
| bin | 服務(wù)啟動, 停止等相關(guān)程序和文件 |
| conf | 配置文件 |
| lib | 庫目錄 |
| logs | 日志目錄 |
| webapps | 應(yīng)用程序, 應(yīng)用部署目錄 |
| work | jsp編譯后的結(jié)果文件, 建議提前預(yù)熱訪問 |
work目錄:
存放編譯后的class和servlet文件, 將來訪問網(wǎng)站后生成的頁面都放在這里. 客戶訪問的jsp頁面都是通過java類來實(shí)現(xiàn)的, 最后會通過jsp轉(zhuǎn)換成servlet對應(yīng)的類, servlet轉(zhuǎn)換成類后, 再轉(zhuǎn)換成class文件, 生成的中間字節(jié)碼就會放在work目錄. 類似于緩存, 下次在訪問同一個頁面, 就沒有必要再把源碼轉(zhuǎn)換成class了, 可以直接利用字節(jié)碼.
注意: 軟件更新后, 一定要更新work目錄的緩存, 否則用戶訪問的還是舊版的程序
└── work
└── Catalina
└── localhost
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
conf目錄:
存放tomcat配置文件
[20:25:07 root@201 ~]#ls /usr/local/tomcat/conf/
Catalina catalina.properties jaspic-providers.xml logging.properties tomcat.conf tomcat-users.xsd
catalina.policy context.xml jaspic-providers.xsd server.xml tomcat-users.xml web.xml
webapps目錄:
存放java應(yīng)用程序, 應(yīng)用部署目錄
[20:27:13 root@201 ~]#ls /usr/local/tomcat/webapps/
docs examples host-manager manager ROOT
3.2 配置文件
3.2.1 配置文件說明
server.xml: 主配置文件, xml格式, 存放在$CATALINA_BASE/conf下. 其中tomcat日志的格式和存放路徑是定義在這里的(vales.AccessLogValue).
[21:25:47 root@201 ~]#vim /usr/local/tomcat/conf/server.xml
...
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
...
web.xml: 對應(yīng)每一個app, 在tomcat中, 會認(rèn)為每一個webapps下的目錄都是對應(yīng)一個app, 一個功能模塊, 比如, 一個app和商品有關(guān), 另一個和用戶登錄有關(guān). 每個目錄有可能有自己獨(dú)立的設(shè)置, 那么就可以單獨(dú)在每個app目錄下單獨(dú)建立一個web.xml來控制每個app的功能和設(shè)置. 如果是所有app共用的設(shè)置, 可以放在tomcat/conf/web.xml下. 如果是每個app單獨(dú)的設(shè)置, 一般放在, $CATALINA_BASE/webapps/APP/WEB-INF下. 可以將/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml文件, 拷貝到對應(yīng)APP/WEB-IN目錄下, 保留基本格式, 再做單獨(dú)的修改
context.xml: 定義目錄映射關(guān)系, 設(shè)定某一個文件夾和一個磁盤文件夾的對應(yīng)關(guān)系. conf/context.xml是全局配置, 也可以對每個app進(jìn)行單獨(dú)的配置.如果是每個app單獨(dú)的設(shè)置, 一般放在, $CATALINA_BASE/webapps/APP/WEB-INF下.
注意: 配置文件大小寫敏感
3.2.2 日志文件
[20:52:34 root@201 ~]#ls /usr/local/tomcat/logs -l
total 44
-rw-r----- 1 tomcat tomcat 19262 Nov 1 20:12 catalina.2020-11-01.log #tomcat服務(wù)日志
-rw-r----- 1 tomcat tomcat 19262 Nov 1 20:12 catalina.out #tomcat服務(wù)日志
-rw-r----- 1 tomcat tomcat 0 Nov 1 20:09 host-manager.2020-11-01.log #host manager管理日志
-rw-r----- 1 tomcat tomcat 1377 Nov 1 20:12 localhost.2020-11-01.log #默認(rèn)主機(jī)服務(wù)日志
-rw-r----- 1 tomcat tomcat 0 Nov 1 20:09 localhost_access_log.2020-11-01.txt #默認(rèn)主機(jī)訪問日志
-rw-r----- 1 tomcat tomcat 0 Nov 1 20:09 manager.2020-11-01.log #manager 管理日志
- 日志格式定義:
[21:25:47 root@201 ~]#vim /usr/local/tomcat/conf/server.xml
...
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
...
# 默認(rèn)格式
[21:28:14 root@201 /usr/local/tomcat/logs]#cat localhost_access_log.2021-03-21.txt
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET / HTTP/1.1" 200 11215
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET /tomcat.css HTTP/1.1" 200 5581
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET /tomcat.png HTTP/1.1" 200 5103
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET /bg-nav.png HTTP/1.1" 200 1401
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET /bg-button.png HTTP/1.1" 200 713
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET /bg-middle.png HTTP/1.1" 200 1918
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET /bg-upper.png HTTP/1.1" 200 3103
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET /asf-logo-wide.svg HTTP/1.1" 200 27235
10.0.0.1 - - [21/Mar/2021:21:28:06 +0800] "GET /favicon.ico HTTP/1.1" 200 21630
通常情況下,為便于分析網(wǎng)站瓶頸,可以將pattern修改為以下格式,其中D代表處理該請求所消耗的毫秒數(shù),如此可以方便找到問題,提高系統(tǒng)性能。
pattern="%h %l %u %t "%r" %s %b %D" />
10.0.0.203 - - [01/Nov/2020:21:33:51 +0800] "GET / HTTP/1.1" 200 11215 258
為了便于日期統(tǒng)計, 也可以將日志以數(shù)字格式顯示, 修改pattern為以下格式
pattern="%h %l %u %{Y-MM-d H:mm:s}t "%r" %s %b %D" />
10.0.0.203 - - 2020-11-1 21:40:25 "GET / HTTP/1.1" 200 11215 354
3.3 組件
3.3.1 組件分層和分類
- 頂級組件:
Server, 代表整個Tomcat容器, 一臺主機(jī)可以啟動多個Tomcat實(shí)例, 需要確保端口不沖突
- 服務(wù)類組件
Service, 實(shí)現(xiàn)組織Engine和Connector, 建立兩者之間關(guān)聯(lián)關(guān)系, Service里面只能包含一個Engine
- 連接器組件
Connector, 有HTTP(默認(rèn)端口8080/tcp), HTTPS(默認(rèn)端口443/tcp), AJP(默認(rèn)端口8009/tcp)協(xié)議的連接器, AJP(Apache Jserv protocol)是一種基于TCP的二進(jìn)制通訊協(xié)議, 管理端口(默認(rèn)為8005端口), 執(zhí)行shutdown命令
- 容器類
Engine, Host(虛擬主機(jī)), Context(上下文, 解決路徑映射)都是容器類組件, 可以嵌入其他組件, 內(nèi)部配置如何運(yùn)行應(yīng)用程序
- 內(nèi)嵌類
可以內(nèi)嵌到其他組件內(nèi), valve, logger, realm, loader, manager等. 以logger舉例, 在不同容器組件內(nèi)分別定義
- 集群類組件
listener, cluster
3.3.2 Tomcat內(nèi)部構(gòu)成

Server: 服務(wù)器, Tomcat運(yùn)行的進(jìn)程實(shí)例, 一個Server中可以有多個Service, 但通常就一個
Service: 服務(wù), 用來組織Engine和Connector的對應(yīng)關(guān)系, 一個Service中只有一個Engine
Connector: 連接器, 負(fù)責(zé)客戶端的HTTP, HTTPS, AJP等協(xié)議連接, 一個Connector只屬于某一個Engine
Engine: 即引擎, 用來響應(yīng)并處理用戶請求. 一個Engine上可以綁定多個Connector, 一個Engine上可以配置多個虛擬主機(jī)
Connector和Engine之間是平級的關(guān)系, 靠Service來連接
Host: 即虛擬主機(jī), 可以實(shí)現(xiàn)多虛擬主機(jī), 例如使用不同的FQDN區(qū)分. 每個虛擬主機(jī)有自己的app目錄, appBase=webapps (相對于$CATALINA_BASE)
Context: 應(yīng)用的上下文, 配置特定URL路徑映射和目錄的映射關(guān)系, URL --> Directory
3.3.3 核心組件
- Tomcat可以啟動一個Server進(jìn)程, 也可以啟動多個進(jìn)程, 即Tomcat多實(shí)例, 但一般只啟動一個
- 啟動Server后, 會創(chuàng)建一個Server提供服務(wù). 一個Server可以創(chuàng)建多個Service, 但是一般也只創(chuàng)建一個
每個Service中, 是Engine是其連接器Connector的關(guān)聯(lián)配置
一個Server, 可以為其創(chuàng)建的Service提供多個連接器Connector, 這些Connector使用了不同的協(xié)議, 綁定了不同的端口. 其作用就是處理來自客戶端的不同的連接請求或響應(yīng)
Service內(nèi)部還定義了Engine, 引擎才是真正的處理請求的入口, 其內(nèi)部定義了多個虛擬主機(jī)Host
Engine對請求頭做分析, 將請求發(fā)送給相應(yīng)的虛擬主機(jī)
如果沒有匹配, 數(shù)據(jù)就發(fā)往Engine上的defaultHost缺省虛擬主機(jī)
Engine上的缺省虛擬主機(jī)可以修改
- Host定義虛擬主機(jī), 虛擬主機(jī)有name名稱, 通過名稱匹配
- Context定義應(yīng)用程序單獨(dú)的路徑映射和配置
3.4 Tomcat 處理請求過程
假設(shè)來自客戶的請求為: http://localhost:8080/test/index.jsp
- 瀏覽器端的請求被發(fā)送到服務(wù)器端端口8080, Tomcat進(jìn)程監(jiān)聽在此端口上, 通過偵聽的HTTP/1.1 Connector獲得此請求
- Connector把該請求交給它所在的Service的Engine來處理, 并等待Engine的相應(yīng)
- Engine獲得請求localhost:8080/test/index.jsp, 遍歷它所有的虛擬主機(jī)Host
- Engine匹配到名為localhost的Host. 如果匹配不到, 就把請求交給該Engine中的defaultHost處理
- localhost Host獲得請求/test/index.jsp, 匹配它所擁有的的所有的Context
- Host匹配到路徑為/test的Context
- path=/test的Context獲得請求index.jsp, 在它的mapping table中尋找對應(yīng)的servlet
- Context匹配到URL PATTERN為*.jsp的servlet, 對應(yīng)于JspServlet類構(gòu)造HttpServletRequest對象和HttpServletResponse對象, 作為參數(shù)調(diào)用JspServlet的doGet或doPost方法.
- Context把執(zhí)行完了之后的HttpServletResponse對象返回給Host
- Host把HttpServlerResponse對象返回給Engine
- Engine把HttpServletResponse對象返回給Connector
- Connector把HttpServletResponse對象返回給瀏覽器端
4. 應(yīng)用部署
4.1 Tomcat 的根目錄結(jié)構(gòu)
Tomcat中默認(rèn)網(wǎng)站根目錄是$CATALINA_BASE/webapps/ROOT
不同web服務(wù)器的網(wǎng)站根目錄: httpd-documentroot; nginx-root; tomcat-appbase(相對于$CATALINA_BASE的目錄)
tomcat vs httpd vs nginx
- 網(wǎng)站默認(rèn)站點(diǎn)目錄結(jié)構(gòu)不同
httpd: /var/www/html
nginx: /usr/share/nginx/html
tomact: /usr/local/tomcat/webapps/ROOT
假如訪問: www.test.org/index.html
httpd訪問的是: /var/www/html/index.html
nginx訪問的是: /usr/share/nginx/html/index.html
tomcat訪問的是: /usr/local/tomcat/webapps/ROOT/index.html
假如訪問的是: www.test.org/blog/index.html
httpd訪問的是: /var/www/html/blog/index.html
nginx訪問的是: /usr/share/nginx/html/blog/index.html
tomcat訪問的是: /usr/local/tomcat/webapps/blog/index.html 其他app目錄和根目錄是平級的, 每個app目錄是一個獨(dú)立的功能
- 案例: 創(chuàng)建app - 1024, 測試頁面訪問
[22:56:31 root@201 ~]#mkdir -pv /usr/local/tomcat/webapps/1024
mkdir: created directory '/usr/local/tomcat/webapps/1024'
[22:56:41 root@201 ~]#cd /usr/local/tomcat/webapps/1024/
[22:56:49 root@201 /usr/local/tomcat/webapps/1024]#echo '/usr/local/tomcat/webapps/1024/test.html' > test.html

每一個虛擬主機(jī)都可以使用appBase指令配置自己的站點(diǎn)目錄, 使用appBase目錄下的ROOT目錄作為主站點(diǎn)目錄
注意: Tomcat服務(wù)器無指定的字符編碼, 瀏覽器會自動識別為GBK, 因此編寫程序代碼時, 要指定utf-8字符編碼
4.2 JSP WebApp目錄結(jié)構(gòu)
- 主頁配置: 默認(rèn)按以下順序查找主頁文件, index.html --> index.htm --> index.jsp
- WEB-INF/: 當(dāng)前目錄WebApp的私有資源路徑, 通過存儲當(dāng)前應(yīng)用使用的web.xml和context.xml配置文件
- META-INF/: 類似于WEB-INF, 也是私有資源的配置信息, 和WEB-INF/目錄一樣瀏覽器無法訪問
- classes/: 類文件, 當(dāng)前webapp需要的類
- lib/: 當(dāng)前應(yīng)用依賴的jar包
4.3 主頁設(shè)置
4.3.1 全局配置實(shí)現(xiàn)修改默認(rèn)主頁文件
默認(rèn)情況下, tomcat會在$CATALINA_BASE/webapps/ROOT目錄下按照以下次序查找文件, 找到第一個后, 就會顯示, 不會繼續(xù)查找
- index.html
- index.htm
- index.jsp
可以通過$CATALINA_BASE/webapps/web.xml中的以下配置來修改默認(rèn)頁面的優(yōu)先級
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
4.3.2 WebApp的專用配置文件
針對app 1024設(shè)置專門的默認(rèn)頁面順序
[16:24:59 root@201 ~]#ls /usr/local/tomcat/webapps/
docs examples host-manager manager ROOT
[16:25:03 root@201 ~]#mkdir /usr/local/tomcat/webapps/1024
[16:25:12 root@201 ~]#ls /usr/local/tomcat/webapps/
1024 docs examples host-manager manager ROOT
[16:25:22 root@201 ~]#echo '/usr/local/tomcat/webapps/1024/index.html' > /usr/local/tomcat/webapps/1024/index.html
[16:25:33 root@201 ~]#echo '/usr/local/tomcat/webapps/1024/index.htm' > /usr/local/tomcat/webapps/1024/index.htm

[16:25:37 root@201 ~]#mkdir /usr/local/tomcat/webapps/1024/WEB-INF
[16:27:20 root@201 ~]#cp -a /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml /usr/local/tomcat/webapps/1024/WEB-INF
[16:29:04 root@201 ~]#vim /usr/local/tomcat/webapps/1024/WEB-INF/web.xml
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
[16:30:58 root@201 ~]#systemctl restart tomcat

配置注意事項(xiàng):
webapp的專有配置優(yōu)先于系統(tǒng)的全局設(shè)置
修改系統(tǒng)的全局配置文件需要重新啟動服務(wù)生效
修改webapp的專有配置, 無需重啟即可生效
確保webapps及子目錄的所有者和所屬組都是tomcat
搭建多虛擬主機(jī), 實(shí)現(xiàn)另一個站點(diǎn)test.wang.org
- 修改server.xml文件
[21:59:32 root@tomcat ~]#vim /usr/local/tomcat/conf/server.xml
...
# 拷貝一份localhost的Host語句塊
<Host name="test.wang.org" appBase="/data/tomcat" # 網(wǎng)站名稱為test.wang.org, 數(shù)據(jù)家目錄為/data/tomcat
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %{Y-MM-d H:mm:s}t "%r" %s %b %D" />
</Host>
...
- 創(chuàng)建數(shù)據(jù)家目錄
[22:01:13 root@tomcat ~]#mkdir -pv /data/tomcat
[22:01:13 root@tomcat ~]#chown -R tomcat.tomcat /data/tomcat/ # 確保tomcat有權(quán)限
# 創(chuàng)建ROOT目錄, 因?yàn)槊總€虛擬主機(jī)的默認(rèn)家目錄都在ROOT
[22:02:00 root@tomcat ~]#mkdir /data/tomcat/ROOT
- 創(chuàng)建默認(rèn)文件
[22:02:53 root@tomcat ~]#cd /data/tomcat/ROOT/
[22:03:01 root@tomcat /data/tomcat/ROOT]#echo 1024-webpage > index.html
[22:03:16 root@tomcat /data/tomcat/ROOT]#ls
index.html
- 訪問測試
[22:03:33 root@tomcat /data/tomcat/ROOT]#vim /etc/hosts
10.0.0.83 test.wang.org
[22:05:04 root@tomcat /data/tomcat/ROOT]#systemctl restart tomcat
[22:05:13 root@tomcat /data/tomcat/ROOT]#curl test.wang.org:8080
1024-webpage
- 總結(jié)
1. 在一個tomcat虛擬主機(jī), 也就是默認(rèn)的localhost中, 可以搭建多個APPS, 虛擬主機(jī)的默認(rèn)站點(diǎn)文件存放在ROOT目錄下, 其余APPS的文件存放在webapps/APPS目錄下
2. 而多虛擬主機(jī)可以自己指定文件位置, 默認(rèn)的文件也是放在ROOT目錄下, 其他APPS文件放在對應(yīng)的appBase/APPS下
4.4 應(yīng)用部署實(shí)現(xiàn)
4.4.1 WebApp應(yīng)用的歸檔格式
- .war: WebApp打包, 類zip打包格式, 通常包括一個應(yīng)用的所有資源, 比如jsp, html,配置文件等, 一個war包就是一個應(yīng)用
- .jar: EJB類文件的打包壓縮, 類zip格式文件, 包括很多的class文件
- .rar: 資源適配器類打包文件, 目前已不常用
- .ear: 企業(yè)群WebApp打包, 目前已不常用
傳統(tǒng)應(yīng)用開發(fā)測試后,通常打包為war格式,這種文件部署到了Tomcat的webapps目錄下,默認(rèn)會自動解開和部署上線
#conf/server.xml中文件配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> # 自動解包, 自動部署
# 把.war包放到webapps目錄下, 會自動解包, 并且部署, 直接就可以在客戶端訪問
# unpackWARs控制是否自動解包, autoDeploy控制是否自動部署, 改為false, 解包后需要手動重啟tomcat服務(wù)
4.4.2 部署方式
部署:將webapp的源文件放置到目標(biāo)目錄,通過web.xml和context.xml文件中配置的路徑就可以訪問該webapp,通過類加載器加載其特有的類和依賴的類到JVM上,即:最終用戶可以通過瀏覽器訪問該應(yīng)用
自動部署:Tomcat一旦發(fā)現(xiàn)多了一個web應(yīng)用APP.war包,默認(rèn)會自動把它解壓縮,加載并啟動起來
手動部署:
- 冷部署:將webapp放到指定目錄,才去啟動Tomcat
- 熱部署:Tomcat服務(wù)不停止,需要依賴manager、ant腳本、tcd(tomcat client deployer)等工具
反部署undeploy:停止webapp的運(yùn)行,并從JVM上清除已經(jīng)加載的類,從Tomcat應(yīng)用目錄中移除部署的文件
啟動start:是webapp能夠訪問
停止stop:webapp不能訪問,不能提供服務(wù),但是JVM并不清除它
4.4.3 部署WebApp的目錄結(jié)構(gòu)
常見開發(fā)項(xiàng)目目錄組成
#目錄結(jié)構(gòu)一般由開發(fā)用工具自動生成,以下模擬生成相關(guān)目錄
mkdir projects/myapp/{WEB-INF,META-INF,classes,lib} -pv
mkdir: 已創(chuàng)建目錄 "projects"
mkdir: 已創(chuàng)建目錄 "projects/myapp"
mkdir: 已創(chuàng)建目錄 "projects/myapp/WEB-INF"
mkdir: 已創(chuàng)建目錄 "projects/myapp/META-INF"
mkdir: 已創(chuàng)建目錄 "projects/myapp/classes"
mkdir: 已創(chuàng)建目錄 "projects/myapp/lib"
#常見應(yīng)用首頁
vi projects/myapp/index.jsp
#手動復(fù)制項(xiàng)目目錄到webapps目錄下去
cp -r projects/myapp/ /usr/local/tomcat/webapps/
# 注意權(quán)限和屬性, 因?yàn)閜rojects目錄一般都是root或者開發(fā)賬號創(chuàng)建, 所以復(fù)制到webapps下, tomcat賬號是沒有權(quán)限的
chown -R tomcat.tomcat /usr/local/tomcat/webapps/myapp
#使用http://YourIP:8080/myapp/訪問測試
4.4.4 案例: 手動部署應(yīng)用
4.4.4.1 手動部署test.jsp文件, 到app - 1024應(yīng)用
- 準(zhǔn)備測試的.jsp頁面
[00:08:10 root@201 /usr/local/tomcat/webapps/1024]#vim test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的內(nèi)容是服務(wù)器端動態(tài)生成字符串,最后拼接在一起
<%
out.println("hello jsp");
%>
</body>
</html>
- 頁面文件的權(quán)限需要根據(jù)業(yè)務(wù)邏輯設(shè)定, 而配置文件的權(quán)限需要把tomcat設(shè)為所有者和所屬組
用戶訪問java的 .jsp程序后, 在work對應(yīng)的功能app目錄下, JSP容器會把jsp頁面轉(zhuǎn)換成servlet, 然后再由tomcat轉(zhuǎn)換成class類, 也就是java字節(jié)碼, 下次訪問時就不需要再做轉(zhuǎn)換了.
一旦jsp程序發(fā)生了更新后, 建議刪除此前生成的servlet和class文件, 防止如果沒有自動生成新的文件, 那么用戶訪問的就還是舊的頁面
- 訪問test.jsp前, 觀察work目錄內(nèi)容
[00:08:24 root@201 /usr/local/tomcat/webapps/1024]#tree ../../work/
../../work/
└── Catalina
└── localhost
├── 1024
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
└── org
└── apache
└── jsp # 此前訪問tomcat主頁面生成的servlet和class類文件
├── index_jsp.class # tomcat再把*.java文件, 轉(zhuǎn)換成class類, 也就是字節(jié)碼
└── index_jsp.java # JSP容器把ROOT下的默認(rèn)index.jsp頁面轉(zhuǎn)換成servlet, *.java文件
11 directories, 2 files
- 訪問test.jsp

- 訪問后查看work目錄變化
[00:13:27 root@201 /usr/local/tomcat/webapps/1024]#tree ../../work/
../../work/
└── Catalina
└── localhost
├── 1024 # work/Catalina/localhost目錄下生成1024-app的目錄
│ └── org
│ └── apache
│ └── jsp
│ ├── test_jsp.class # servlet被轉(zhuǎn)換成class類
│ └── test_jsp.java # test.jsp被轉(zhuǎn)換成servlet
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
└── org
└── apache
└── jsp
├── index_jsp.class
└── index_jsp.java
14 directories, 4 files
4.4.5 案例: 自動部署應(yīng)用
apps2項(xiàng)目, 包含兩個文件, 一個html一個jsp
4.4.5.1 制作應(yīng)用的war包文件
[00:29:48 root@201 ~]#mkdir /data/app2
[00:30:56 root@201 ~]#cd /data/app2
[00:30:58 root@201 /data/app2]#vim test.html
<h1>This is test html </h1>
[00:32:03 root@201 /data/app2]#vim test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的內(nèi)容是服務(wù)器端動態(tài)生成字符串,最后拼接在一起
<%
out.println("hello jsp");
%>
</body>
</html>
[00:32:15 root@201 /data/app2]#jar cvf /data/app2.war *
added manifest
adding: test.html(in = 28) (out= 27)(deflated 3%)
adding: test.jsp(in = 316) (out= 271)(deflated 14%)
[00:36:07 root@201 /data/app2]#cd /data
[00:36:15 root@201 /data]#ls
app2 app2.war
[00:36:16 root@201 /data]#chown tomcat.tomcat app2.war
[00:37:36 root@201 /data]#ll
total 4
drwxr-xr-x 2 root root 39 Mar 22 00:32 app2
-rw-r--r-- 1 tomcat tomcat 858 Mar 22 00:35 app2.war
4.4.5.2 自動應(yīng)用部署制作好的war包
[00:37:38 root@201 /data]#cd /usr/local/tomcat
[00:39:17 root@201 /usr/local/tomcat]#ls work/Catalina/localhost/ # 復(fù)制war包前, localhost目錄沒有app2目錄
1024 docs examples host-manager manager ROOT
[00:39:49 root@201 /usr/local/tomcat]#cp -p /data/app2.war webapps/
[00:40:04 root@201 /usr/local/tomcat]#ls work/Catalina/localhost/ # 復(fù)制war包后, localhost目錄自動生成app2目錄
1024 app2 docs examples host-manager manager ROOT
[00:40:44 root@201 /usr/local/tomcat]#ll webapps/
total 8
drwxr-xr-x 3 root root 89 Mar 22 00:08 1024
drwxr-x--- 3 tomcat tomcat 55 Mar 22 00:40 app2 # app2自動解包
-rw-r--r-- 1 tomcat tomcat 858 Mar 22 00:35 app2.war # war包還會保存
drwxr-x--- 15 tomcat tomcat 4096 Mar 21 18:59 docs
drwxr-x--- 6 tomcat tomcat 83 Mar 21 18:59 examples
drwxr-x--- 5 tomcat tomcat 87 Mar 21 18:59 host-manager
drwxr-x--- 6 tomcat tomcat 114 Mar 21 18:59 manager
drwxr-x--- 3 tomcat tomcat 283 Mar 21 18:59 ROOT
[00:41:17 root@201 /usr/local/tomcat]#ll webapps/app2/
total 8
drwxr-x--- 2 tomcat tomcat 44 Mar 22 00:40 META-INF
-rw-r----- 1 tomcat tomcat 28 Mar 22 00:30 test.html
-rw-r----- 1 tomcat tomcat 316 Mar 22 00:32 test.jsp
[00:41:46 root@201 /usr/local/tomcat]#ll webapps/app2/META-INF/
total 4
-rw-r----- 1 tomcat tomcat 69 Mar 22 00:35 MANIFEST.MF
-rw-r----- 1 tomcat tomcat 0 Mar 22 00:35 war-tracker
# 此時work/Catalina/localhost生成的app2目錄下沒有內(nèi)容, 因?yàn)榭蛻舳诉€沒有人訪問
[00:41:55 root@201 /usr/local/tomcat]#ll work/Catalina/localhost/app2/
total 0
- 訪問test.jsp文件

# app2目錄下會生成servlet和class類文件
[00:45:44 root@201 /usr/local/tomcat]#tree work/Catalina/localhost/app2/
work/Catalina/localhost/app2/
+-- org
+-- apache
+-- jsp
+-- test_jsp.class
+-- test_jsp.java
3 directories, 2 files

- 實(shí)現(xiàn)反部署, 自動刪除緩存文件
[00:45:50 root@201 /usr/local/tomcat]#rm -rf webapps/app2.war # 刪除webapps下的war包
[00:47:30 root@201 /usr/local/tomcat]#ls webapps/
1024 app2 docs examples host-manager manager ROOT
[00:47:33 root@201 /usr/local/tomcat]#ls webapps/ # 過幾秒后, 對應(yīng)的app目錄會自動刪除
1024 docs examples host-manager manager ROOT
[00:48:45 root@201 /usr/local/tomcat]#ls work/Catalina/localhost/ # app2目錄也會被自動刪除
1024 docs examples host-manager manager ROOT
4.4.6 案例: 部署基于JAVA的博客系統(tǒng)JPress
- 下載地址
# 把war包放在webapps下
[01:26:04 root@201 /usr/local/tomcat/webapps]#ls
1024 docs examples host-manager jpress-v3.2.1 jpress-v3.2.1.war manager ROOT
# 制作軟連接
[01:26:15 root@201 /usr/local/tomcat/webapps]#ln -s jpress-v3.2.1 jpress
[01:31:18 root@201 /usr/local/tomcat/webapps]#ll
total 69376
drwxr-xr-x 3 root root 89 Mar 22 00:08 1024
drwxr-x--- 15 tomcat tomcat 4096 Mar 21 18:59 docs
drwxr-x--- 6 tomcat tomcat 83 Mar 21 18:59 examples
drwxr-x--- 5 tomcat tomcat 87 Mar 21 18:59 host-manager
lrwxrwxrwx 1 root root 13 Mar 22 01:31 jpress -> jpress-v3.2.1
drwxr-x--- 6 tomcat tomcat 86 Mar 22 01:26 jpress-v3.2.1
-rw-r--r-- 1 root root 71034734 Mar 22 01:02 jpress-v3.2.1.war
drwxr-x--- 6 tomcat tomcat 114 Mar 21 18:59 manager
drwxr-x--- 3 tomcat tomcat 283 Mar 21 18:59 ROOT
# 安裝MySQL, 授權(quán)jpress用戶
[01:33:41 root@201 /usr/local/tomcat/webapps]#yum -y install mysql-server
[01:35:20 root@201 /usr/local/tomcat/webapps]#systemctl enable --now mysqld
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
[01:35:36 root@201 /usr/local/tomcat/webapps]#mysql -e 'create user jpress@"localhost" identified by "jpress"'
[01:35:58 root@201 /usr/local/tomcat/webapps]#mysql -e 'create database jpress'
[01:36:10 root@201 /usr/local/tomcat/webapps]#mysql -e 'grant all on jpress.* to jpress@"localhost"'
- 訪問jpress



4.4.7 案例: 基于WEB的管理Server Status和Manager App實(shí)現(xiàn)應(yīng)用部署
Tomcat提供了基于WEB的管理頁面, 默認(rèn)由tomcat-admin-webapps.norach包提供相關(guān)文件
4.4.7.1 實(shí)現(xiàn)WEB管理Server Status和Manager App
- 默認(rèn)情況下, Server Status, Manager App, Host Manager三個鏈接都是拒絕訪問的

- 啟動方法
- 先修改conf/tomcat-users.xml
[01:58:25 root@201 /usr/local/tomcat]#ls conf/
Catalina catalina.policy catalina.properties context.xml jaspic-providers.xml jaspic-providers.xsd logging.properties server.xml tomcat.conf tomcat-users.xml tomcat-users.xsd web.xml
# 查看配置信息
[01:58:27 root@201 /usr/local/tomcat]#vim conf/server.xml
...
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<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" /> # 此文件指定了授權(quán)用戶信息
</GlobalNamingResources>
...
- 用戶認(rèn)證通過配置文件conf/tomcat-users.xml設(shè)定, 需要添加manager-gui角色
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/> # 添加manager-gui角色
<user username="admin" password="000000" roles="manager-gui"/> # 添加管理員賬號和密碼
</tomcat-users>
# 全局配置修改后, 需要重啟tomcat服務(wù)
[02:03:13 root@201 /usr/local/tomcat]#systemctl restart tomcat
- 修改conf/tomcat-users.xml后, 在服務(wù)器本機(jī)就可以訪問Server Status和Manager兩個app了, 不過需要在服務(wù)器上安裝firefox, 并且利用xmanager開啟Linux上的圖形化界面
[02:06:50 root@201 /usr/local/tomcat]#yum -y install firefox
[02:14:35 root@201 /usr/local/tomcat]#yum -y install libGL.so.1
[02:13:49 root@201 /usr/local/tomcat]#export DISPLAY=10.0.0.1:0.0
- Windows開啟xManager-broadcast, 然后在tomcat服務(wù)器執(zhí)行以下命令
[02:15:25 root@201 /usr/local/tomcat]#firefox 127.0.0.1:8080
Running without a11y support!
libGL error: MESA-LOADER: failed to open swrast (search paths /usr/lib64/dri)
libGL error: failed to load driver: swrast

- Server Status

- Manager App

- Host Manager仍然不能訪問, 需要添加admin-gui到配置文件
vim /usr/local/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/> # 添加admin-gui角色
<user username="admin" password="000000" roles="manager-gui,admin-gui"/> # 允許manger-gui和admin-gui
- 修改webapps/manager/META-INF/context.xml文件
默認(rèn)情況, Manager和Host-Manager只允許本地訪問, 因此Windows無法遠(yuǎn)程打開
...
<Context antiResourceLocking="false" privileged="true" >
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> # 從正則表達(dá)式可以看出, 默認(rèn)只能本地訪問
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
...
# 修改配置, 允許10.0.0.0網(wǎng)段訪問
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />
# 因?yàn)樾薷牡氖莣ebapps的配置文件, 因此無需重啟服務(wù), 即可生效
- 此時, 就可以通過Windows訪問Server Status和Manager App了


- 設(shè)置host-manager允許遠(yuǎn)程訪問
vim webapps/host-manager/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />
4.4.7.2 基于WEB應(yīng)用程序管理器實(shí)現(xiàn)應(yīng)用程序的部署
Manager App管理界面可以實(shí)現(xiàn)以下功能:
應(yīng)用程序管理: 可以啟動, 停止, 重新加載, 反部署, 清理過期session
應(yīng)用程序部署: 熱部署, 部署war文件
方式1: 指定目錄部署軟件
# 創(chuàng)建代碼存放目錄
[03:02:17 root@201 ~]#mkdir /data/tomcat
# 給tomcat賬號權(quán)限
[03:02:41 root@201 ~]#chown -R tomcat.tomcat /data/tomcat
# 把之前部署在1024目錄中的test.jsp復(fù)制到該目錄下, 作為要部署的代碼
[03:02:21 root@201 ~]#cd /data/tomcat/
[03:02:24 root@201 /data/tomcat]#cp /usr/local/tomcat/webapps/1024/test.jsp .
- 添加選項(xiàng)
Context Path (required): 指定通過瀏覽器訪問的虛擬目錄, 部署成功后, 會在webapps下生成對應(yīng)目錄, 代碼會部署到該目錄下
WAR or Directory URL: 指定服務(wù)器本地存放代碼的磁盤目錄

- 點(diǎn)擊Deploy后查看結(jié)果

[03:03:52 root@201 /data/tomcat]#ll /usr/local/tomcat/webapps/
total 69380
drwxr-xr-x 3 root root 89 Mar 22 00:08 1024
drwxr-x--- 3 tomcat tomcat 55 Mar 22 03:01 app2
-rw-r----- 1 tomcat tomcat 858 Mar 22 03:01 app2.war
drwxr-x--- 15 tomcat tomcat 4096 Mar 21 18:59 docs
drwxr-x--- 6 tomcat tomcat 83 Mar 21 18:59 examples
drwxr-x--- 5 tomcat tomcat 87 Mar 21 18:59 host-manager
lrwxrwxrwx 1 root root 13 Mar 22 01:31 jpress -> jpress-v3.2.1
drwxr-x--- 6 tomcat tomcat 86 Mar 22 01:26 jpress-v3.2.1
-rw-r--r-- 1 root root 71034734 Mar 22 01:02 jpress-v3.2.1.war
drwxr-x--- 6 tomcat tomcat 114 Mar 21 18:59 manager
drwxr-x--- 3 tomcat tomcat 283 Mar 21 18:59 ROOT
drwxr-x--- 2 tomcat tomcat 22 Mar 22 03:06 testjsp # 自動生成testjsp目錄
[03:09:03 root@201 /data/tomcat]#ll /usr/local/tomcat/webapps/testjsp/
total 4
-rw-r----- 1 tomcat tomcat 316 Mar 22 03:06 test.jsp
- 瀏覽器訪問

方式2: 直接部署war包文件
需要把war包傳到Windows上
- 先刪除之前部署的testjsp, 點(diǎn)擊undeploy后, webapps下的testjsp目錄會被自動刪除

- 把test.jsp打包成war文件, 傳給Windows
[03:15:48 root@201 /data/tomcat]#jar cvf test.war *
added manifest
adding: test.jsp(in = 316) (out= 271)(deflated 14%)
[03:15:52 root@201 /data/tomcat]#ll
total 8
-rw-r--r-- 1 tomcat tomcat 316 Mar 22 03:02 test.jsp
-rw-r--r-- 1 root root 721 Mar 22 03:15 test.war
- 選擇war包部署

- 驗(yàn)證部署成功


[03:17:48 root@201 ~]#ll /usr/local/tomcat/webapps/test
total 4
drwxr-x--- 2 tomcat tomcat 44 Mar 22 03:17 META-INF
-rw-r----- 1 tomcat tomcat 316 Mar 22 03:02 test.jsp