簡(jiǎn)介
Tomcat是由Apache軟件基金會(huì)維護(hù)的jdk+servlet(嚴(yán)格地說(shuō)是+jsp)實(shí)現(xiàn)的精簡(jiǎn)版的JAVA ee,由于它只在jdk的基礎(chǔ)上附加了jsp和servlet類庫(kù),所以它的應(yīng)用范圍主要是web應(yīng)用
它是一種應(yīng)用程序服務(wù)器,只提供servlet容器,同時(shí)還提供apache解析靜態(tài)html,只不過(guò)之它的處理能力不如獨(dú)立的apache服務(wù)器。類似的應(yīng)用程序服務(wù)還有websphere/weblogic/jetty/resin/jboss等,它們都是在jdk基礎(chǔ)上附加各種類庫(kù)實(shí)現(xiàn)不同程度的java ee(tomcat=jdk+servlet)。對(duì)于tomcat來(lái)說(shuō),它高度模塊化,通過(guò)各個(gè)組件實(shí)現(xiàn)各種功能。它的體系結(jié)構(gòu)如下圖所示:

-
server是頂級(jí)類,一個(gè)server算是一個(gè)tomcat實(shí)例,在此層次中可定義tomcat服務(wù)的監(jiān)聽(tīng)端口。
-
service是server下的子組件,用于封裝綁定connector和contAInor,并為它們提供一個(gè)名稱屬性。有了service就可以提供相關(guān)的服務(wù),如監(jiān)聽(tīng)TCP連接請(qǐng)求、處理http請(qǐng)求。server是管理整個(gè)tomcat實(shí)例的層次,它和提供服務(wù)沒(méi)有關(guān)系。
-
connector是連接器,定義http協(xié)議(默認(rèn))以及該協(xié)議的監(jiān)聽(tīng)端口。用于接收客戶端請(qǐng)求并將containor處理的數(shù)據(jù)返回給客戶端。
-
containor稱為容器,和connector連接器進(jìn)行綁定。該容器內(nèi)有4個(gè)子容器,包括:engine容器、host容器、context容器、WrApper容器。容器用于分析、處理請(qǐng)求,并構(gòu)建響應(yīng)給connector以發(fā)送給客戶端。它和connector是tomcat的心臟組件。
-
engine容器定義servlet引擎,用于定義引擎的名稱、默認(rèn)的虛擬主機(jī)。引擎用于分析http請(qǐng)求并將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的虛擬主機(jī)。host容器用于定義虛擬主機(jī)。
-
context容器用于定義webapp,一個(gè)context定義一個(gè)webapp。它是真正管理servlet容器的層次。
-
wrapper容器對(duì)應(yīng)的是真正的servlet容器,一個(gè)wrapper代表一個(gè)servlet,它負(fù)責(zé)管理一個(gè)Servlet,包括的Servlet的裝載、初始化、執(zhí)行以及資源回收。Wrapper是最底層的容器,一個(gè)context只能包含一個(gè)wrapper。在配置文件中,無(wú)法配置該容器的屬性。
核心組件
-
web容器: 完成Web服務(wù)器的功能。
-
Servlet 容器: 名字為catalina,用于處理Servlet 代碼。
-
JSP容器: 用于將JSP動(dòng)態(tài)網(wǎng)頁(yè)翻譯成Servlet 代碼。
-
因此Tomcat 是Web 應(yīng)用服務(wù)器,也是一個(gè)Servlet/JSP 容器。Tomcat 作為Servlet容器,負(fù)責(zé)處理客戶請(qǐng)求,把請(qǐng)求傳送給Servlet,并將Servlet的響應(yīng)傳送回給客戶。

servlet
Servlet是 Java Servlet的簡(jiǎn)稱,可以理解為是,是用Java編寫的服務(wù)器端程序,一個(gè)服務(wù)連接器,具有獨(dú)立于平臺(tái)和協(xié)議的特性。簡(jiǎn)單的理解:servlet 就是一 個(gè)中間件,包含了接口和方法,將客戶端和數(shù)據(jù)庫(kù)連接,從而實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)的創(chuàng)建。
JSP
JSP全稱Java Server Pages, 是一種動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)。使用JSP 標(biāo)簽在HTML網(wǎng)頁(yè)中插入Java 代碼。標(biāo)簽通常以<%開(kāi)頭,以%>結(jié)束。JSP是一種Java servlet,主要用于實(shí)現(xiàn)Java web應(yīng)用程序的用戶界面部分。JSP通過(guò)網(wǎng)頁(yè)表單獲取用戶輸入數(shù)據(jù)、訪問(wèn)數(shù)據(jù)庫(kù)及其他數(shù)據(jù)源,然后動(dòng)態(tài)地創(chuàng)建網(wǎng)頁(yè)。
功能組件結(jié)構(gòu)
-
負(fù)責(zé)接收和反饋外部請(qǐng)求的連接器Connector
-
負(fù)責(zé)處理請(qǐng)求的容器Container。
連接器和容器相輔相成,一起構(gòu)成了基本的web服務(wù)Service。每個(gè)Tomcat服務(wù)器可以管理多個(gè)Service。
Connector
負(fù)責(zé)對(duì)外接收和響應(yīng)請(qǐng)求。它是Tomcat與外界的交通樞細(xì),監(jiān)聽(tīng)端口接收外界請(qǐng)求,并將請(qǐng)求處理后傳遞給容器做業(yè)務(wù)處理,最后將容器處理后的結(jié)果響應(yīng)給外界。
Container
負(fù)責(zé)對(duì)內(nèi)處理業(yè)務(wù)邏輯。其內(nèi)部由Engine、 Host、Context和wrapper 四個(gè)容器組成,用于管理和調(diào)用Servlet 相關(guān)邏輯。
Service
對(duì)外提供的Web服務(wù)。主要包含Connector 和Container 兩個(gè)核心組件,以及其他功能組件。
Tomcat 可以管理多個(gè)Service, 且各Service之間相互獨(dú)立。
(一個(gè)service就是一個(gè)外部應(yīng)用,各個(gè)service之間是相互獨(dú)立的,每個(gè)service可以監(jiān)聽(tīng)不同的端口號(hào))
Container結(jié)構(gòu)分析:
每個(gè)Service 會(huì)包含一一個(gè)Container 容器。在Container 內(nèi)部包含了4個(gè)子容器: 4個(gè)子容器的作用分別是:
(1) Engine: 引擎,用來(lái)管理多個(gè)虛擬主機(jī),一個(gè)Service最多只能有一一個(gè)Engine;
(2) Host: 代表一個(gè)虛擬主機(jī),也可以叫站點(diǎn),通過(guò)配置Host就可以添加站點(diǎn);
(3) Context: 代表一個(gè)Web應(yīng)用,包含多個(gè)Servlet 封裝器;
(4) wrapper: 封裝器,容器的最底層。每一Wrapper 封裝著一個(gè)servlet, 負(fù)責(zé)對(duì)象實(shí)例的創(chuàng)建、執(zhí)行和銷毀功能。
Engine、Host、Context 和Wrapper,這四個(gè)容器之間屬于父子關(guān)系。
容器由一個(gè)引擎可以管理多個(gè)虛擬主機(jī)。每個(gè)虛擬主機(jī)可以管理多個(gè)web應(yīng)用。每個(gè)Web應(yīng)用會(huì)有多個(gè)Servlet封裝器。

請(qǐng)求過(guò)程
用戶在瀏覽器中輸入網(wǎng)址,請(qǐng)求被發(fā)送到本機(jī)端口8080, 被在那里監(jiān)聽(tīng)的Connector 獲得。Connector 把該請(qǐng)求交給它所在的Service 的Engine (Container) 來(lái)處理,并等待Engine 的回應(yīng)。請(qǐng)求會(huì)在Engine、 Host、 Context 和wrapper 這四個(gè)容器之間層層調(diào)用,最后在Servlet 中執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯、數(shù)據(jù)存儲(chǔ)等。執(zhí)行完之后的請(qǐng)求響應(yīng)在Context、 Host、 Engine 容器之間層層返回,最后返回給Connector,并通過(guò)Connector 返回給客戶端。

端口和主要目錄說(shuō)明
tomcat端口
客戶端和tomcat進(jìn)行連接時(shí)使用:
-
8080端口:http的默認(rèn)端口
-
8443端口:https的默認(rèn)端口
-
8005端口: shutdown用于關(guān)閉tomcat進(jìn)程。tomcat監(jiān)聽(tīng)的關(guān)閉端口,就是說(shuō)這個(gè)端口負(fù)責(zé)監(jiān)聽(tīng)關(guān)閉tomcat的請(qǐng)求。
-
8009端口: 用于轉(zhuǎn)發(fā),負(fù)責(zé)和其他http服務(wù)器建立連接。但一般不用,因?yàn)閠omcat一般放在后端服務(wù)器,其他服務(wù)器轉(zhuǎn)發(fā)給tomcat。
tomcat主要目錄
| 目錄 | 說(shuō)明 |
|---|---|
| bin | 存放啟動(dòng)和關(guān)閉Tomcat 的腳本文件,如catalina.sh、startup.sh、shutdown.sh |
| conf | 存放Tomcat 服務(wù)器的各種配置文件,如主配置文件server.xml 和應(yīng)用默認(rèn)的部署描述文件web.xml |
| lib | 存放Tomcat運(yùn)行需要的庫(kù)文件的jar 包,一般不作任何改動(dòng) |
| logs | 存放Tomcat 執(zhí)行時(shí)的日志 |
| temp | 存放Tomcat 運(yùn)行時(shí)產(chǎn)生的文件 |
| webapps | 存放Tomcat默認(rèn)的web應(yīng)用項(xiàng)目資源的目錄 |
| work | Tomcat 的工作目錄,存放web應(yīng)用代碼生成和編譯文件 |
目錄 說(shuō)明
部署步驟
在部署 Tomcat 之前必須安裝好 jdk,因?yàn)門omcat是采用Java語(yǔ)言編寫的,而jdk是java的開(kāi)發(fā)工具,沒(méi)有jdk,Tomcat是跑不起來(lái)的
下載并安裝 JDK
關(guān)閉防火墻
systemctl stop firewalld
setenforce 0
將安裝 Tomcat 所需軟件包傳到/opt目錄下
apache-tomcat-9.0.16.tar.gz
jdk-8u201-linux-x64.rpm
切換至/opt下,安裝JDK
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm
設(shè)置JDK環(huán)境變量#/etc/profiled.d目錄下存放著profile文件中調(diào)用的變量,所以我們?cè)谠撃夸浵滦陆ㄒ粋€(gè)java的變量腳本,讓profile調(diào)用即可。
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 #定義環(huán)境變量
export JRE_HOME=$JAVA_HOME/jre #定義環(huán)境變量
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib #定義環(huán)境變量
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile.d/java.sh #刷新文件,使立即生效
java -version #再次查看JDK版本
部署tomcat服務(wù)
cd /opt
tar zxf apache-tomcat-9.0.16.tar.gz #解壓tomcat安裝包
mv apache-tomcat-9.0.16 /usr/local/tomcat #將解壓后的源碼包目錄拷貝至/usr/local/下并重命名為tomcat
啟動(dòng)tomcat
去bin目錄下
后臺(tái)啟動(dòng)
/usr/local/tomcat/bin/startup.sh
或
/usr/local/tomcat/bin/catalina.sh start
前臺(tái)啟動(dòng)
/usr/local/tomcat/bin/catalina.sh run
netstat -natp | grep 8080
啟動(dòng)Tomcat的方法
startup.sh #后臺(tái)啟動(dòng)tomcat
catalina.sh start #后臺(tái)啟動(dòng)tomcat
catalina.sh run #前臺(tái)啟動(dòng) tomcat
#關(guān)閉tomcat的方法
shutdown.sh 關(guān)閉tomcat
查看tomcat是否啟動(dòng)
netstat ss ps jps
瀏覽器訪問(wèn)測(cè)試
瀏覽器訪問(wèn)Tomcat的默認(rèn)主頁(yè) http://192.168.80.7:8080

優(yōu)化t
第一次啟動(dòng)tomcat可能會(huì)發(fā)現(xiàn)Tomcat啟動(dòng)很慢,如果/dev/random中的隨機(jī)數(shù)不足,默認(rèn)情況下可能會(huì)需要幾十秒,可以修改jdk參數(shù)進(jìn)行改。
/dev/urandom,它可以作為生成較低強(qiáng)度密碼的偽隨機(jī)數(shù)生成器,不建議用于生成高強(qiáng)度長(zhǎng)期密碼。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改這一行
securerandom.source= file:/dev/urandom
總結(jié)
JDK的安裝,在運(yùn)行tomcat前必須將JDK安裝好。
/usr/local/tomcat/bin目錄中的 startup.sh 和 shutdown.sh 腳本可以直接運(yùn)行,但 catalina.sh 文件需要加上命令參數(shù),start為后臺(tái)運(yùn)行,run為前臺(tái)運(yùn)行。
/dev/random: 阻塞型,讀取它就會(huì)產(chǎn)生隨機(jī)數(shù)據(jù),但該數(shù)據(jù)取決于熵池噪聲,當(dāng)熵池空了,對(duì)/dev/random 的讀操作也將會(huì)被阻塞。
/dev/urandom: 非阻塞的隨機(jī)數(shù)產(chǎn)生器,它會(huì)重復(fù)使用熵池中的數(shù)據(jù)以產(chǎn)生偽隨機(jī)數(shù)據(jù)。 這表示對(duì)/dev/urandom的讀取操作不會(huì)產(chǎn)生阻塞,但其輸出的熵可能小于/dev/random的。 它可以作為生成較低強(qiáng)度密碼的偽隨機(jī)數(shù)生成器,不建議用于生成高強(qiáng)度長(zhǎng)期密碼。






