前言
Tomcat作為一款網站服務器,目前市面上Java程序使用的比較多,作為運維工人,有必要了解一款如何去運行Java環境的網站服務。
目錄
一、Java相關介紹
1. Java歷史
2. Java跨平臺服務
3. Java實現動態網頁功能
3.1 servelt
3.2 jsp
4. JDK?
4.1 JDK和JRE關系
4.2 虛擬機各種版本
4.2.1?Oracle JDK
4.2.2?OpenJDK
5. Web架構
5.1?web資源和訪問
5.2?后臺應用架構
二、Tomcat部署
1. 歷史介紹
2. 官網地址
3. 架構
4. 部署
4.1 部署Java環境
4.2 安裝Tomcat
4.2.1 基于包安裝tomcat
4.2.2 二進制安裝tomcat
4.3 啟動Tomcat
4.4 指定用戶管理Tomcat?
5. 配置文件介紹及核心組件
5.1?配置文件
5.1.1 日志文件?
5.2 組件
5.2.1 組件分層和分類
5.2.2 核心組件?
5.2.3 tomcat 處理請求過程
5.3 項目站點訪問
5.4 主頁文件的優先級?
6.?打包jar包實際操作
一、Java相關介紹
1. Java歷史
Java語言最早是在1991年開始設計的,最初叫Oak項目,它初衷是跑在不同機頂盒設備中的。Sun公司第一個Java公開版本1.0發布于1996年。口號是"一次編寫,到處運行"(Write once,Run anywhere),跨平臺運行。后來被Oracle甲骨文公司收購,他有一款程序叫做java虛擬機,類似我們平時使用的VMware等虛擬機。但是也存在部分區別:
VisualBox、VMware就屬于系統虛擬機,用來模擬系統。他們完全是對物理計算機的仿真。提供了一個可以運行完整操作系統的軟件平臺。
Java虛擬機是典型的程序虛擬機,專門為執行單個計算機程序而設計,在Java虛擬機中執行的指令我們稱為Java字節碼指令。無論是系統虛擬機還是程序虛擬機,在上面運行的軟件都唄限制于虛擬機提供的資源中。
2. Java跨平臺服務
同一個JAVA程序(JAVA字節碼的集合),通過JAVA虛擬機(JVM)運行于各大主流操作系統平臺比如Windows、CentOS、Ubuntu等。程序以虛擬機為中介,來實現跨平臺。
圖示:
由于各種操作系統ABl不一樣,采用編譯方式,需要為不同操作系統編譯成相應格式的二進制程序才能運行。 java程序寫好后,使用java的編譯器,編譯成字節碼(二進制文件),運行在java虛擬機上,再編譯成各個系統的的執行文件。??
3. Java實現動態網頁功能
3.1 servelt
本質是一段java程序,用于擴展服務器功能,原理就是在java程序中嵌入html語言。其作用就是將java的動態效果和靜態頁面組合成一個特定的文件,即外面是java語言,里面是html語言。在Web服務器上形成一個靜態頁面交給Nginx傳給代理端最終到達客戶端。在Servlet中最大的問題是,HTML輸出和java代碼混在一起,如果網頁布局要調整,Java源代碼就需要隨之進行調整,對于開發人員來說就是噩夢。
3.2 jsp
為了解決servelt弊端,衍生出了jsp技術,jsp是一種用于開發動態Web內容的Java技術。它允許開發人員在HTML頁面中嵌入Java代碼,從而能夠生成動態內容。果網頁布局需要調整,JAVA源代碼不需要很大的調整。當然了,最后jsp文件還是要轉換成servelt,jsp相當于提供了另外的模板。
綜上:
Servlet主要用于處理HTTP請求和生成動態內容;Servlet可以直接與請求和響應對象交互,因此非常適合處理復雜的業務邏輯和動態內容生成。JSP用于創建動態Web頁面,JSP頁面會被轉換成 Servlet,并且在用戶請求時動態生成HTML內容。ervlet和JSP通常一起使用以構建完整的 Java Web 應用程序。Servlet處理后端邏輯,而JSP負責前端頁面呈現,二者相輔相成,共同構建出功能強大的動態Web應用程序。
4. JDK?
4.1 JDK和JRE關系
Java Development Kit(JDK)是Java編程語言的軟件開發工具包。它提供了編譯、調試和運行 Java 程序所需的工具和庫。JDK包括Java運行時環境(JRE),以及用于開發Java應用程序的編譯器、調試器和其他工具。 JDK還包含了許多類庫和支持文件。
JDK 的核心組件包括:
- Java 編譯器(javac):用于將 Java 源代碼編譯成 Java 字節碼文件。
- Java 運行時環境(JRE):用于執行 Java 應用程序的運行時環境。
- 開發工具(如調試器、性能分析器等):用于開發和調試 Java 應用程序。
- Java 類庫:包括標準的 Java 類和接口,以及支持文件,可幫助開發人員構建各種類型的應用程序。
架構圖示:?
4.2 虛擬機各種版本
4.2.1?Oracle JDK
安裝oracle官方JDK:
官方下載鏈接:
#注意需要注冊登錄后,才能下載JDK,這里只能下載8版本的,后面版本收費
https://www.oracle.com/java/technologies/downloads/#java8
(1) Oracle JDK的rpm安裝:?
① 準備rpm包,yum安裝
[root@localhost data]# ls
jdk-8u291-linux-x64.rpm
[root@localhost data]# yum install jdk-8u291-linux-x64.rpm -y
已安裝:jdk1.8.x86_64 2000:1.8.0_291-fcs
[root@localhost data]# rpm -q jdk1.8.x86_64
jdk1.8-1.8.0_291-fcs.x86_64
② 查看當前系統中Java的版本信息
[root@localhost data]# java -version
openjdk version "1.8.0_402"
OpenJDK Runtime Environment (build 1.8.0_402-b06)
OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)
③ 設置環境變量
將默認環境變量openjdk修改為oraclejdk,Oracle JDK相較于OpenJDK更加穩定。
[root@localhost data]# which java
/usr/bin/java
[root@localhost data]# ll /usr/bin/java
lrwxrwxrwx. 1 root root 22 3月 1 12:10 /usr/bin/java -> /etc/alternatives/java
#系統自帶的java不是剛剛安裝的java,所以需要修改環境變量[root@localhost data]# find / -name javac
/var/lib/alternatives/javac
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/bin/javac
/usr/java/jdk1.8.0_291-amd64/bin/javac
[root@localhost data]# cd /usr/java/jdk1.8.0_291-amd64/bin/
#查看執行文件[root@localhost ~]# vim /etc/profile78 export JAVA_HOME=/usr/java/default #指明變量,java程序目錄79 export PATH=$JAVA_HOME/bin:$PATH #指明PATH路徑變量80 export JRE_HOME=$JAVA_HOME/jre ? #指向Java運行時環境(JRE)的安裝目錄,非必要項81 export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/ #層級目錄,非必要項[root@localhost ~]# . /etc/profile
[root@localhost ~]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
#后期所有安裝的jdk將變成oraclejdk
(2) Oracle JDK的二進制文件安裝:
二進制安裝屬于編譯安裝的一種,只是沒有執行make install。
① 準備二進制包解壓
[root@localhost data]# ls
jdk-8u291-linux-x64.tar.gz
[root@localhost data]# tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
② 創建軟鏈接,設置環境變量
[root@localhost data]# cd /usr/local/
[root@localhost local]# ls
bin etc games include jdk1.8.0_291 lib lib64 libexec sbin share src
[root@localhost local]# ln -s jdk1.8.0_291/ jdk[root@localhost local]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
[root@localhost local]# . /etc/profile
③ 查看當前系統中Java的版本信息
[root@localhost local]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@localhost local]# which java
/usr/local/jdk/bin/java
4.2.2?OpenJDK
在CentOS中,可以使用yum倉庫安裝openjdk:
[root@localhost ~]# yum list "*jdk*"
#查看可以安裝哪些版本[root@localhost ~]# yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
#安裝jdk環境[root@localhost ~]# java -version
openjdk version "1.8.0_402"
OpenJDK Runtime Environment (build 1.8.0_402-b06)
OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)
#查看版本
5. Web架構
在Tomcat的Web架構中,資源是指Web應用程序中的組件,例如HTML、CSS、JavaScript文件、圖像、Servlet和JSP等。這些資源在Tomcat中存儲在特定目錄結構中,以供訪問和處理。
5.1?web資源和訪問
圖示:
PC端或移動端瀏覽器訪問:從靜態服務器請求HTML、CSS、JS等文件發送到瀏覽器端,瀏覽器端接收后渲染在瀏覽器上,從圖片服務器請求圖片資源顯示,從業務服務器訪問動態內容,動態內容是請求后臺服務訪問數據庫后得到的,最終返回到瀏覽器端。
手機 App訪問:內置了HTML和JS文件,不需要從靜態WEB服務器下載JS或HTML。為的就是減少文件的發送,現代前端開發使用的文件太多或太大了,按需從圖片服務器請求圖片,從業務服務器請求動態數據。用戶需求多樣,更多的內容還是需要由業務服務器提供,業務服務器往往都是由一組服務器組成。 ?
5.2?后臺應用架構
圖示:
① 單體應用架構
傳統架構(單機系統)。一個項目一個工程:比如商品、訂單、支付、庫存、登錄、注冊等等,統一部署,一個進程。即所有的服務部署在一臺服務器上,并且代碼存放在一起,這樣缺點顯然很明顯,一個板塊完成度很慢會影響整個項目上線,同時項目完成打包成一個文件夾,這個文件夾會非常臃腫;另外,只要有一個板塊故障,會影響全部架構。
- all in one的架構方式,把所有的功能單元放在一 個應用里。然后把整個應用部署到一臺服務器上。如果負載能力不行,將整個應用進行水平復制,進行擴展,然后通過負載均衡實現訪問
- Java實現: JSP、 Servlet,打包成一個jar. war部署
- 易于開發和測試:也十分方便部署:當需要擴展時,只需要將war復制多份,然后放到多個服務器上,再做個負載均衡就可以了
- 如果某個功能模塊出問題,有可能全站不可訪問,修改Bug后、某模塊功能修改或升級后,需要停掉整個服務,重新整體重新打包、部署這個應用war包,功能模塊相互之間耦合度高,相互影響,不適合當今互聯網業務功能的快速迭代
- 特別是對于一個大型應用,我們不可能吧所有內容都放在一個應用里面,我們如何維護、如何分工合作都是問題。如果項目龐大,管理難度大
- web應用服務器:開源的tomcat. jetty. glassfish。 商用的有weblogic、websphere. Jboss
②?微服務與soa基本理念差不多,只是微服務更細 ?
SOA:拆分功能模塊,比如支付、訂單、庫存、登錄進行拆分,這樣就需要四臺服務器支持。最根本的是,這些模塊之間的聯動、數據如何交互成為了開發的難題,自然成本也將升高。所以逐漸被市場淘汰。?
Microservice:一臺服務器軟件系統被劃分為一組小型、獨立部署的服務,歸功于容器技術的興盛,給微服務帶來了極大的便利。微服務化的核心就是將傳統的一站式應用,根據業務拆分成一個一個的服務,徹底去掉耦合,每一個微服務提供單個業務功能,一個服務只做一件事。每個服務都圍繞著具體業務進行構建,并且能夠被獨立地部署到生產環境、類生產環境等。從技術角度講就是一種小而獨立的處理過程,類似與進程的概念,能夠自行單獨啟動或銷毀;分布式系統中,不同的服務可以使用各自獨立的數據庫。
二、Tomcat部署
1. 歷史介紹
Apache Tomcat,通常簡稱為Tomcat,是一個免費的開放源代碼的Web應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,Tomcat具有處理HTML頁面的功能,它還是一個Servlet和JSP容器 ,由Apache軟件基金會開發和維護。Tomcat的主要功能是實現和提供Java Servlet和JavaServer Pages(JSP)的運行環境。
2. 官網地址
官網: Apache Tomcat? - Welcome!
官網文檔: Apache Tomcat 8 (8.5.99) - Documentation Index
幫助文檔:
Apache Tomcat Home - Apache Tomcat - Apache Software Foundation
FAQ - Apache Tomcat - Apache Software Foundation
3. 架構
4. 部署
4.1 部署Java環境
部署tomcat首先要安裝jdk,環境部署在前文已經介紹,這里就不過多贅述,可以參考4.2.1?Oracle JDK,總體步驟如下:
① 解壓安裝包
② 創建軟鏈接,設置環境變量
③ 測試java(java -version)
4.2 安裝Tomcat
4.2.1 基于包安裝tomcat
[root@localhost ~]# yum list tomca
可安裝的軟件包
tomcat.noarch 7.0.76-16.el7_9
#這里版本太老了,不建議使用yum安裝
4.2.2 二進制安裝tomcat
CentOS 7 的yum源的tomcat版本老舊,而CentOS8 yum源里無tomcat。目前比較主流的Tomcat是8和9版本,推薦從Apache官網下載二進制tomcat包進行安裝,此為生產常用方式。
官方和鏡像站點下載:
https://tomcat.apache.org/download-80.cgi
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/
① 解壓安裝包
[root@localhost data]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@localhost data]# tar xf apache-tomcat-9.0.16.tar.gz
[root@localhost data]# ls
apache-tomcat-9.0.16 apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@localhost data]# cp -r apache-tomcat-9.0.16 /usr/local/
② 創建軟鏈接,后期可多版本部署tomcat
[root@localhost data]# cd /usr/local/
[root@localhost local]# ln -s apache-tomcat-9.0.16/ tomcat
[root@localhost local]# ls
apache-tomcat-9.0.16 bin etc games include jdk jdk1.8.0_291 lib lib64 libexec sbin share src tomcat
③ 定義環境變量
[root@localhost local]# vim /etc/profile
83 export CATALINA_HOME=/usr/local/tomcat
[root@localhost local]# . /etc/profile
注意:如果已經設置了JAVA_HOME環境變量,那么在安裝Tomcat時,按需設置CATALINA_HOME環境變量即可。?
4.3 啟動Tomcat
① 啟動tomcat
[root@localhost local]# cd tomcat/
[root@localhost tomcat]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
[root@localhost tomcat]# cd bin/
[root@localhost bin]# ls
bootstrap.jar commons-daemon.jar digest.sh shutdown.sh tool-wrapper.sh
catalina.bat commons-daemon-native.tar.gz makebase.bat startup.bat version.bat
catalina.sh configtest.bat makebase.sh startup.sh version.sh
catalina-tasks.xml configtest.sh setclasspath.bat tomcat-juli.jar
ciphers.bat daemon.sh setclasspath.sh tomcat-native.tar.gz
ciphers.sh digest.bat shutdown.bat tool-wrapper.bat[root@localhost bin]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
② 檢查端口
[root@localhost local]# ss -natp | grep java
LISTEN 0 100 :::8080 :::* users:(("java",pid=2370,fd=57))
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=2370,fd=82))
LISTEN 0 100 :::8009 :::* users:(("java",pid=2370,fd=62))
關于端口:?
- 8080:默認接收http請求的端口
- 8005:安全端口,可以關閉tomcat
- 8009:apache和tomcat聯動ajp協議
③ 訪問8080
頁面地址:/usr/local/tomcat/webapps/ROOT/index.jsp
注意:當目錄下存在index.html,訪問頁面會優先識別index.html。
④ 關閉tomcat
[root@localhost bin]# pwd
/usr/local/tomcat/bin
[root@localhost bin]# bash shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
4.4 指定用戶管理Tomcat?
① 新建用戶
[root@localhost bin]# useradd -s /sbin/nologin tomcat
[root@localhost bin]# chown -R tomcat:tomcat /usr/local/tomcat
[root@localhost bin]# ll /usr/local/tomcat
lrwxrwxrwx. 1 tomcat tomcat 21 3月 1 14:47 /usr/local/tomcat -> apache-tomcat-9.0.16/
#修改屬主屬組
② 修改systemd服務的配置文件?
[root@localhost bin]# vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=syslog.target network.target[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat[Install]
WantedBy=multi-user.target[root@localhost bin]# systemctl daemon-reload #重新加載配置
③ 文件夾授權,啟動tomcat并查看端口號
[root@localhost local]# chown tomcat:tomcat /usr/local/tomcat/ -R
[root@localhost local]# systemctl start tomcat
[root@localhost local]# ss -natp | grep tomcat
#由于tomcat運行在java虛擬機內,所以無法過濾
[root@localhost local]# ss -natp | grep 8080
LISTEN 0 100 :::8080 :::* users:(("java",pid=39410,fd=54))
5. 配置文件介紹及核心組件
5.1?配置文件
安裝目錄下文件介紹:
目錄名字 | 功能 |
---|---|
bin | 存放啟動和關閉 Tomcat 的腳本文件,比較常用的是 catalina.sh、startup.sh、shutdown.sh 三個文件 |
conf | 存放 Tomcat 服務器的各種配置文件,比較常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四個文件。 |
lib | 存放 Tomcat 服務器的 jar 包,一般不作任何改動,除非連接第三方服務,比如 redis,那就需要添加相對應的 jar 包 |
logs | 存放 Tomcat 日志 catalina.out |
temp | 存放 Tomcat 運行時產生的文件 |
webapps | 存放項目資源的目錄 |
work | Tomcat 工作目錄,一般清除 Tomcat 緩存的時候會使用到(升級版本時注意要刪除里面的緩存) |
work工作目錄結構:
[root@localhost ~]# cd /usr/local/tomcat/work/
[root@localhost work]# ls
Catalina
[root@localhost work]# tree
.
└── Catalina└── localhost├── docs├── examples├── host-manager├── manager└── ROOT└── org└── apache└── jsp├── index_jsp.class #字節碼└── index_jsp.java #java程序
瀏覽器訪問192.168.190.102:8080/test.jsp?,再次查看查看目錄結構:
[root@localhost work]# tree
.
└── Catalina└── localhost├── docs├── examples├── host-manager├── manager└── ROOT└── org└── apache└── jsp├── index_jsp.class├── index_jsp.java├── test_jsp.class└── test_jsp.java10 directories, 4 files
由此看到jsp緩存目錄多了兩個文件,當java運行動態程序的時候,需要先轉成class碼再去執行java程序。如果執行過一次頁面訪問,會把所需的文件緩存在jsp這個文件夾中,從而加速二次訪問。
當升級tomcat失敗,如:a1版本升級到a2版本后,依然是a1,會是什么原因?
在a1版本是,每次運行會在緩存目錄形成類似于a1.java和a1.class文件;如果沒有清理緩存,當拿到a2升級包將其放入到webapps中,運行后依然訪問原來的頁面,將原來的緩存文件刪除即可。當升級上線前,可以預熱訪問生成新的緩存文件,加入用戶訪問速度。最后定義覆蓋原來的軟鏈接。
conf子目錄 :
文件名 | 說明 |
server.xml | 主配置文件,全局生效。/usr/local/tomcat/conf/server.xml |
web.xml | 每個webapp只有“部署"后才能被訪問,它的部署方式通常由web.xml進行定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認部署相關的配置,每個web應用也可以使用專用配置文件,來覆蓋全局文件 |
context.xml | 用于定義所有web應用均需加載的Context配置,此文件為所有的webapps提供默認配置,每個web應用也可以使用自已專用的配置,它通常由專用的配置文件context.xml來定義,其存放位置為WEB-INF/目錄中,覆蓋全局的文件 |
tomcat-users.xml | 用戶認證的賬號和密碼文件 |
catalina.policy | 當使用security選項啟動omcat時,用于為tomcat設置安全策略 |
catalina.properties | Tomcat環境變量的配置,用于設定類加載器路徑,以及一些與JVM調優相關參數 |
logging.properties | Tomcat日志系統相關的配置,可以修改日志級別和日志路徑等 |
5.1.1 日志文件?
參考文檔: https://cwiki.apache.org/confluence/display/TOMCAT/Logging
日志格式: Apache Tomcat 9 Configuration Reference (9.0.86) - The Valve Component
日志目錄:
[root@localhost ~]# cd /usr/local/tomcat/logs/
[root@localhost logs]# ls
catalina.2024-03-01.log #tomcat服務日志
host-manager.2024-03-01.log #host manager管理日志
localhost_access_log.2024-03-01.txt #默認主機訪問日志
catalina.out #tomcat服務日志
localhost.2024-03-01.log #默認主機日志
manager.2024-03-01.log #manager管理日志
查看訪問日志格式:
[root@localhost ~]# tail /usr/local/tomcat/conf/server.xmlDocumentation at: /docs/config/valve.htmlNote: 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 %t "%r" %s %b" /> #說明: "在html
中表示雙引號"符號,此行可以修改日志格式</Host></Engine></Service>
</Server>
5.2 組件
Tomcat本身是由多個組件組成的。
5.2.1 組件分層和分類
- 頂級組件:Server,代表整個Tomcat容器,一臺主機可以啟動多tomcat 實例 ,需要確保端口不要產生沖突
- 服務類組件:Service,實現組織Engine和Connector,建立兩者之間關聯關系, service 里面只能包含一個Engine
- 連接器組件:Connector,有HTTP(默認端口8080/tcp)、HTTPS(默認端口8443/tcp)、AJP(默認端口8009/tcp)協議的連接器,AJP(Apache Jserv protocol)是一種基于TCP的二進制通訊協議。
- 容器類:Engine、Host(虛擬主機)、Context(上下文件,解決路徑映射)都是容器類組件,可以嵌入其它組件,內部配置如何運行應用程序。
- 內嵌類:可以內嵌到其他組件內,valve、logger、realm、loader、manager等。以logger舉例,在不同容器組件內分別定義。
- 集群類組件:istener、cluster
① 首先開啟 tomcat進程,會有server產生?
② 然后產生 一個 service管理組件管理所有其他組件的
③ 用戶發送請求httpd請求過來,connector連接器(默認監聽)接收到此請求, 會轉交給engine (引擎)
④ engine(引擎) 會處理請求, 遍歷host(虛擬主機)會交給客戶訪問的host, 如果找不到交給默認的 host 會根據 上下文 context (上下文) 映射關系 去找相對應的文件
⑤ 找到文件后,交給JSP生成代碼, 再交給servlet生成html,原路返回反饋給用戶
5.2.2 核心組件?
名稱 | 說明 |
server | Tomcat中的Server代表整個Tomcat服務器實例。它可以包含多個Service,并負責啟動和停止整個Tomcat服務器 |
service | 服務,用來組織Engine(引擎)和Connector(連接器,端口)的對應關系,一個service中只有一個Engine;Service是Tomcat中的一個抽象概念,它代表了一個具體的服務,通常對應于一個網絡連接器(如HTTP)。每個Service可以包含多個Connector,用于處理不同協議或端口的連接。 |
connector | 連接器,負責客戶端的HTTP、HTTPS、AJP等協議連接。一個Connector只屬于某一個Engine。它負責監聽特定的網絡端口,并將傳入的請求傳遞給Engine進行處理。Tomcat支持多種類型的Connector,包括基于HTTP/1.1、基于HTTP/2以及基于AJP協議的Connector。 |
Engine | 即引擎,用來響應并處理用戶請求。一個Engine上可以綁定多個Connector,一個Tomcat實例通常只有一個Engine,它可以包含多個虛擬主機(Host)。 |
Host | Host代表Tomcat中的虛擬主機,每個Host可以包含多個Web應用程序。它允許在單個Tomcat實例上托管多個域名或主機名對應的應用程序。 |
Context | 配置特定url路徑映射和目錄的映射關系: url => directory;Context代表了Web應用程序的上下文,它定義了一個Web應用程序的運行環境。每個Web應用程序都有自己的Context,其中包含了該應用程序的配置信息、Servlet映射、會話管理等。 |
5.2.3 tomcat 處理請求過程
① 接收請求:當Tomcat服務器接收到來自客戶端的HTTP請求時,它會將請求傳遞給適當的組件進行處理。
② Web容器處理:請求首先被傳遞給Tomcat的Web容器。Web容器根據請求的URL確定是哪個應用程序的請求,并將其傳遞給該應用程序。
③ Servlet處理:如果請求是針對Servlet的,Web容器會在部署的應用程序中查找匹配的Servlet,并將請求傳遞給該Servlet進行處理。
④ JSP處理:如果請求是針對JSP頁面的,Web容器會將其編譯為Servlet,然后按照Servlet的處理方式進行處理。
⑤ 請求處理:Servlet或JSP頁面處理請求并生成響應。這可能包括從數據庫檢索數據、執行業務邏輯等。
⑥ 響應返回:生成的響應被發送回Tomcat服務器。
⑦ 發送響應:Tomcat服務器將響應發送回給客戶端,完成整個請求-響應周期。
5.3 項目站點訪問
Tomcat中,"ROOT"是默認的上下文路徑(context path)。當用戶訪問Tomcat服務器的根目錄時,實際上是在訪問部署在名為"ROOT"的默認Web應用程序。
疑問:新建項目文件夾,訪問路徑是否要發生變化?
① 默認項目ROOT新建web文件,webapps文件夾新建test目錄,新建web文件,
[root@localhost ~]# cd /usr/local/tomcat/webapps/
[root@localhost webapps]# ls
docs examples host-manager manager ROOT[root@localhost webapps]# cd ROOT/
[root@localhost ROOT]# ls
asf-logo-wide.svg bg-nav.png index.jsp tomcat.css tomcat-power.gif
bg-button.png bg-upper.png RELEASE-NOTES.txt tomcat.gif tomcat.svg
bg-middle.png favicon.ico test.jsp tomcat.png WEB-INF
[root@localhost ROOT]# echo ROOT > index.html[root@localhost webapps]# mkdir test
[root@localhost webapps]# cd test/
[root@localhost test]# echo test > index.html
[root@localhost test]# ls
index.html
② 訪問網頁
?
③ 小結
從上面訪問結果來看,ROOT是默認站點目錄,可以省略。以項目為站點,webapps中每個文件夾代表一個站點,當不指明站點時,會直接去默認站點找web文件;如果指定站點目錄,將去該站點目錄下尋找匹配文件。
5.4 主頁文件的優先級?
在Tomcat中,主頁文件的優先級規定了服務器在用戶訪問Web應用程序時應該加載哪個文件作為默認頁面。這種優先級順序的設定有助于確保用戶能夠快速地找到并瀏覽網站的內容,同時也提供了一種靈活的方式來組織和展示Web應用程序的內容。
默認優先級:
[root@localhost ~]# vim /usr/local/tomcat/conf/web.xml
4704 <welcome-file-list>
4705 <welcome-file>index.html</welcome-file>
4706 <welcome-file>index.htm</welcome-file>
4707 <welcome-file>index.jsp</welcome-file>
4708 </welcome-file-list>
示例:自定義test項目主頁文件優先級
① 復制WEB-INF至test項目中
[root@localhost ROOT]# cd
[root@localhost ~]# cd /usr/local/tomcat/webapps/ROOT/
[root@localhost ROOT]# ls
asf-logo-wide.svg bg-nav.png index.html test.jsp tomcat.png WEB-INF
bg-button.png bg-upper.png index.jsp tomcat.css tomcat-power.gif
bg-middle.png favicon.ico RELEASE-NOTES.txt tomcat.gif tomcat.svg
[root@localhost ROOT]# cp -r WEB-INF/ /usr/local/tomcat/webapps/test/
② 編輯模板配置文件
[root@localhost WEB-INF]# vim /usr/local/tomcat/webapps/test/WEB-INF/web.xml30 <welcome-file-list>31 <welcome-file>index.jsp</welcome-file>32 <welcome-file>index.html</welcome-file>33 <welcome-file>index.htm</welcome-file>34 </welcome-file-list>
③ 新建jsp文件,修改文件夾WEB-INF屬性
[root@localhost test]# ls
index.html WEB-INF
[root@localhost test]# echo jsp > index.jsp
[root@localhost test]# chown tomcat:tomcat WEB-INF/ -R
④ 訪問站點目錄
6.?打包jar包實際操作
.war:WebApp打包,類zip格式文件,通常包括一個應用的所有資源,如jsp,html,配置文件等
.jar:EJB類文件的打包壓縮類zip格式文件,包括很多的class文件,網景公司發明
.rar:資源適配器類打包文件,目前已不常用
.ear:企業級WebApp打包,目前已不常用
在實際生產中,我們不需要寫jar包,只需要將jar包放到webapps文件夾下某一個項目內即可,并且jar包放在這里后會自動解壓,自動部署項目,不需要額外操作。
示例:模擬jar包
① 模擬文件打包成jar包
[root@localhost fql]# echo jsp > test.jsp
[root@localhost fql]# echo html > test.html
[root@localhost fql]# ls
test.html test.jsp
[root@localhost fql]# jar cvf /fql/app1.war * ##打包
已添加清單
正在添加: test.html(輸入 = 5) (輸出 = 7)(壓縮了 -40%)
正在添加: test.jsp(輸入 = 4) (輸出 = 6)(壓縮了 -50%)
[root@localhost fql]# ls
app1.war test.html test.jsp
② 拷貝jar包至webapps文件夾
[root@localhost fql]# cd /usr/local/tomcat/webapps/
[root@localhost webapps]# ls
docs examples host-manager manager ROOT test
[root@localhost webapps]# cp /fql/app1.war .
[root@localhost webapps]# ls
app1.war docs examples host-manager manager ROOT test
[root@localhost webapps]# ls
app1 app1.war docs examples host-manager manager ROOT test
#不需要新建項目app1,jar包自動部署
③ 查看項目站點文件
[root@localhost webapps]# ls app1
META-INF test.html test.jsp
④?下線只要刪除war包直接自動刪除?
[root@localhost webapps]# rm -rf app1.war
[root@localhost webapps]# ls
app1 docs examples host-manager manager ROOT test
[root@localhost webapps]# ls
docs examples host-manager manager ROOT test