16. Tomcat - 基礎(chǔ)配置和應(yīng)用部署

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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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)成

圖片.png
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

  1. 網(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

圖片.png

每一個虛擬主機(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
image.png
[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
image.png

配置注意事項(xiàng):

webapp的專有配置優(yōu)先于系統(tǒng)的全局設(shè)置
修改系統(tǒng)的全局配置文件需要重新啟動服務(wù)生效
修改webapp的專有配置, 無需重啟即可生效
確保webapps及子目錄的所有者和所屬組都是tomcat

搭建多虛擬主機(jī), 實(shí)現(xiàn)另一個站點(diǎn)test.wang.org

  1. 修改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 &quot;%r&quot; %s %b %D" /> 
      </Host>
...
  1. 創(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
  1. 創(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

  1. 訪問測試
[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

  1. 總結(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
圖片.png
  • 訪問后查看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文件
圖片.png
# 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

圖片.png
  • 實(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
圖片.png
圖片.png
圖片.png

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三個鏈接都是拒絕訪問的
圖片.png
  • 啟動方法
  1. 先修改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
圖片.png
  • Manager App
圖片.png
  • 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
  1. 修改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了
圖片.png
  1. 設(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ù)器本地存放代碼的磁盤目錄
圖片.png
  • 點(diǎn)擊Deploy后查看結(jié)果
圖片.png
[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
  • 瀏覽器訪問
圖片.png

方式2: 直接部署war包文件

需要把war包傳到Windows上
  • 先刪除之前部署的testjsp, 點(diǎn)擊undeploy后, webapps下的testjsp目錄會被自動刪除
圖片.png
  • 把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包部署
圖片.png
  • 驗(yàn)證部署成功
圖片.png
圖片.png
[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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容