簡介
Tomcat是由Apache軟件基金會維護的jdk+servlet(嚴格地說是+jsp)實現的精簡版的JAVA ee,由于它只在jdk的基礎上附加了jsp和servlet類庫,所以它的應用范圍主要是web應用
它是一種應用程序服務器,只提供servlet容器,同時還提供apache解析靜態html,只不過之它的處理能力不如獨立的apache服務器。類似的應用程序服務還有websphere/weblogic/jetty/resin/jboss等,它們都是在jdk基礎上附加各種類庫實現不同程度的java ee(tomcat=jdk+servlet)。對于tomcat來說,它高度模塊化,通過各個組件實現各種功能。它的體系結構如下圖所示:
-
server是頂級類,一個server算是一個tomcat實例,在此層次中可定義tomcat服務的監聽端口。
-
service是server下的子組件,用于封裝綁定connector和contAInor,并為它們提供一個名稱屬性。有了service就可以提供相關的服務,如監聽TCP連接請求、處理http請求。server是管理整個tomcat實例的層次,它和提供服務沒有關系。
-
connector是連接器,定義http協議(默認)以及該協議的監聽端口。用于接收客戶端請求并將containor處理的數據返回給客戶端。
-
containor稱為容器,和connector連接器進行綁定。該容器內有4個子容器,包括:engine容器、host容器、context容器、WrApper容器。容器用于分析、處理請求,并構建響應給connector以發送給客戶端。它和connector是tomcat的心臟組件。
-
engine容器定義servlet引擎,用于定義引擎的名稱、默認的虛擬主機。引擎用于分析http請求并將請求轉發給對應的虛擬主機。host容器用于定義虛擬主機。
-
context容器用于定義webapp,一個context定義一個webapp。它是真正管理servlet容器的層次。
-
wrapper容器對應的是真正的servlet容器,一個wrapper代表一個servlet,它負責管理一個Servlet,包括的Servlet的裝載、初始化、執行以及資源回收。Wrapper是最底層的容器,一個context只能包含一個wrapper。在配置文件中,無法配置該容器的屬性。
核心組件
-
web容器: 完成Web服務器的功能。
-
Servlet 容器: 名字為catalina,用于處理Servlet 代碼。
-
JSP容器: 用于將JSP動態網頁翻譯成Servlet 代碼。
-
因此Tomcat 是Web 應用服務器,也是一個Servlet/JSP 容器。Tomcat 作為Servlet容器,負責處理客戶請求,把請求傳送給Servlet,并將Servlet的響應傳送回給客戶。
servlet
Servlet是 Java Servlet的簡稱,可以理解為是,是用Java編寫的服務器端程序,一個服務連接器,具有獨立于平臺和協議的特性。簡單的理解:servlet 就是一 個中間件,包含了接口和方法,將客戶端和數據庫連接,從而實現動態網頁的創建。
JSP
JSP全稱Java Server Pages, 是一種動態網頁開發技術。使用JSP 標簽在HTML網頁中插入Java 代碼。標簽通常以<%開頭,以%>結束。JSP是一種Java servlet,主要用于實現Java web應用程序的用戶界面部分。JSP通過網頁表單獲取用戶輸入數據、訪問數據庫及其他數據源,然后動態地創建網頁。
功能組件結構
-
負責接收和反饋外部請求的連接器Connector
-
負責處理請求的容器Container。
連接器和容器相輔相成,一起構成了基本的web服務Service。每個Tomcat服務器可以管理多個Service。
Connector
負責對外接收和響應請求。它是Tomcat與外界的交通樞細,監聽端口接收外界請求,并將請求處理后傳遞給容器做業務處理,最后將容器處理后的結果響應給外界。
Container
負責對內處理業務邏輯。其內部由Engine、 Host、Context和wrapper 四個容器組成,用于管理和調用Servlet 相關邏輯。
Service
對外提供的Web服務。主要包含Connector 和Container 兩個核心組件,以及其他功能組件。
Tomcat 可以管理多個Service, 且各Service之間相互獨立。
(一個service就是一個外部應用,各個service之間是相互獨立的,每個service可以監聽不同的端口號)
Container結構分析:
每個Service 會包含一一個Container 容器。在Container 內部包含了4個子容器: 4個子容器的作用分別是:
(1) Engine: 引擎,用來管理多個虛擬主機,一個Service最多只能有一一個Engine;
(2) Host: 代表一個虛擬主機,也可以叫站點,通過配置Host就可以添加站點;
(3) Context: 代表一個Web應用,包含多個Servlet 封裝器;
(4) wrapper: 封裝器,容器的最底層。每一Wrapper 封裝著一個servlet, 負責對象實例的創建、執行和銷毀功能。
Engine、Host、Context 和Wrapper,這四個容器之間屬于父子關系。
容器由一個引擎可以管理多個虛擬主機。每個虛擬主機可以管理多個web應用。每個Web應用會有多個Servlet封裝器。
請求過程
用戶在瀏覽器中輸入網址,請求被發送到本機端口8080, 被在那里監聽的Connector 獲得。Connector 把該請求交給它所在的Service 的Engine (Container) 來處理,并等待Engine 的回應。請求會在Engine、 Host、 Context 和wrapper 這四個容器之間層層調用,最后在Servlet 中執行對應的業務邏輯、數據存儲等。執行完之后的請求響應在Context、 Host、 Engine 容器之間層層返回,最后返回給Connector,并通過Connector 返回給客戶端。
端口和主要目錄說明
tomcat端口
客戶端和tomcat進行連接時使用:
-
8080端口:http的默認端口
-
8443端口:https的默認端口
-
8005端口: shutdown用于關閉tomcat進程。tomcat監聽的關閉端口,就是說這個端口負責監聽關閉tomcat的請求。
-
8009端口: 用于轉發,負責和其他http服務器建立連接。但一般不用,因為tomcat一般放在后端服務器,其他服務器轉發給tomcat。
tomcat主要目錄
目錄 | 說明 |
---|---|
bin | 存放啟動和關閉Tomcat 的腳本文件,如catalina.sh、startup.sh、shutdown.sh |
conf | 存放Tomcat 服務器的各種配置文件,如主配置文件server.xml 和應用默認的部署描述文件web.xml |
lib | 存放Tomcat運行需要的庫文件的jar 包,一般不作任何改動 |
logs | 存放Tomcat 執行時的日志 |
temp | 存放Tomcat 運行時產生的文件 |
webapps | 存放Tomcat默認的web應用項目資源的目錄 |
work | Tomcat 的工作目錄,存放web應用代碼生成和編譯文件 |
目錄 說明
部署步驟
在部署 Tomcat 之前必須安裝好 jdk,因為Tomcat是采用Java語言編寫的,而jdk是java的開發工具,沒有jdk,Tomcat是跑不起來的
下載并安裝 JDK
關閉防火墻
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
設置JDK環境變量#/etc/profiled.d目錄下存放著profile文件中調用的變量,所以我們在該目錄下新建一個java的變量腳本,讓profile調用即可。
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 #定義環境變量
export JRE_HOME=$JAVA_HOME/jre #定義環境變量
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib #定義環境變量
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile.d/java.sh #刷新文件,使立即生效
java -version #再次查看JDK版本
部署tomcat服務
cd /opt
tar zxf apache-tomcat-9.0.16.tar.gz #解壓tomcat安裝包
mv apache-tomcat-9.0.16 /usr/local/tomcat #將解壓后的源碼包目錄拷貝至/usr/local/下并重命名為tomcat
啟動tomcat
去bin目錄下
后臺啟動
/usr/local/tomcat/bin/startup.sh
或
/usr/local/tomcat/bin/catalina.sh start
前臺啟動
/usr/local/tomcat/bin/catalina.sh run
netstat -natp | grep 8080
啟動Tomcat的方法
startup.sh #后臺啟動tomcat
catalina.sh start #后臺啟動tomcat
catalina.sh run #前臺啟動 tomcat
#關閉tomcat的方法
shutdown.sh 關閉tomcat
查看tomcat是否啟動
netstat ss ps jps
瀏覽器訪問測試
瀏覽器訪問Tomcat的默認主頁 http://192.168.80.7:8080
優化t
第一次啟動tomcat可能會發現Tomcat啟動很慢,如果/dev/random中的隨機數不足,默認情況下可能會需要幾十秒,可以修改jdk參數進行改。
/dev/urandom,它可以作為生成較低強度密碼的偽隨機數生成器,不建議用于生成高強度長期密碼。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改這一行
securerandom.source= file:/dev/urandom
總結
JDK的安裝,在運行tomcat前必須將JDK安裝好。
/usr/local/tomcat/bin目錄中的 startup.sh 和 shutdown.sh 腳本可以直接運行,但 catalina.sh 文件需要加上命令參數,start為后臺運行,run為前臺運行。
/dev/random: 阻塞型,讀取它就會產生隨機數據,但該數據取決于熵池噪聲,當熵池空了,對/dev/random 的讀操作也將會被阻塞。
/dev/urandom: 非阻塞的隨機數產生器,它會重復使用熵池中的數據以產生偽隨機數據。 這表示對/dev/urandom的讀取操作不會產生阻塞,但其輸出的熵可能小于/dev/random的。 它可以作為生成較低強度密碼的偽隨機數生成器,不建議用于生成高強度長期密碼。