是湯姆貓還是卡特琳娜?Tomcat的詳細介紹

語言: CN / TW / HK

theme: condensed-night-purple

Tomcat

什麼是Tomcat

Tomcat 是 Java 語言開發的,Tomcat 伺服器是一個免費的開放原始碼的 Web 應用伺服器,是 Apache 軟體基金會的 Jakarta 專案中的一個核心專案,由 Apache、Sun 和其他一些公司及個人共同開發而成。

Tomcat 屬於輕量級應用伺服器,在中小型系統和併發訪問使用者不是很多的場合下被普遍使用,是開發和除錯 JSP 程式的首選。一般來說,Tomcat 雖然和 Apache 或者 Nginx 這些 Web 伺服器一樣,具有處理 HTML 頁面的功能,然而由於其處理靜態 HTML 的能力遠不及 Apache 或者 Nginx,所以 Tomcat 通常是作為一個 Servlet 和 JSP 容器,單獨執行在後端。

Tomcat的構成

Tomcat 由一系列的元件構成,其中核心的元件有三個:

  1. Web 容器:完成 Web 伺服器的功能。

  2. Servlet 容器:名字為 catalina,用於處理 Servlet 程式碼。

  3. JSP 容器:用於將 JSP 動態網頁翻譯成 Servlet 程式碼。

因此 Tomcat 是 Web 應用伺服器,也是一個 Servlet/JSP 容器。Tomcat 作為 Servlet 容器,負責處理客戶請求,把請求傳送給 Servlet,並將 Servlet 的響應傳送回給客戶。

202104062009530.png

什麼是 servlet?

Servlet 是Java Servlet 的簡稱,可以理解為是一個服務聯結器,是用 Java 編寫的伺服器端程式,具有獨立於平臺和協議的特性, 簡單的理解:servlet 就是一箇中間件,包含了介面和方法,將客戶端和資料庫連線,從而實現動態網頁的建立。

什麼是 JSP?

JSP 全稱 Java Server Pages,是一種動態網頁開發技術。它使用 JSP 標籤在HTML網頁中插入 Java 程式碼。標籤通常以 <% 開頭,以 %> 結束。

JSP 是一種 Java servlet,主要用於實現 Java web 應用程式的使用者介面部分。

JSP 通過網頁表單獲取使用者輸入資料、訪問資料庫及其他資料來源,然後動態地建立網頁。

Tomcat 功能元件結構

Tomcat 的核心功能有兩個,分別是負責接收和反饋外部請求的聯結器 Connector,和負責處理請求的容器 Container。

其中聯結器和容器相輔相成,一起構成了基本的 web 服務 Service。每個 Tomcat 伺服器可以管理多個 Service。

  • Connector:負責對外接收和響應請求。它是Tomcat與外界的交通樞紐,監聽埠接收外界請求,並將請求處理後傳遞給容器做業務處理,最後將容器處理後的結果響應給外界。
  • Container:負責對內處理業務邏輯。其內部由 Engine、Host、Context和Wrapper 四個容器組成,用於管理和呼叫 Servlet 相關邏輯。
  • Service:對外提供的 Web 服務。主要包含 Connector 和 Container 兩個核心元件,以及其他功能元件。Tomcat 可以管理多個 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 封裝器。

Tomcat 請求過程

  1. 使用者在瀏覽器中輸入網址,請求被髮送到本機埠 8080,被在那裡監聽的 Connector 獲得;
  2. Connector 把該請求交給它所在的 Service 的 Engine(Container)來處理,並等待 Engine 的迴應;
  3. 請求在 Engine、Host、Context 和 Wrapper 這四個容器之間層層呼叫,最後在 Servlet 中執行對應的業務邏輯、資料儲存等。
  4. 執行完之後的請求響應在 Context、Host、Engine 容器之間層層返回,最後返回給 Connector,並通過 Connector 返回給客戶端。

20210406201321152.png

tomcat安裝部署步驟

下載並安裝JDK

  • 1、JDK是Java語言的軟體開發工具包
  • 2、JDK是Tomcat執行的必要環境
  • 3、根據計算機硬體配置,選擇安裝包

```  1. #關閉防火牆  systemctl disable --now firewalld  setenforce 0    2. #將安裝 Tomcat 所需軟體包傳到/opt目錄下。  apache-tomcat-9.0.16.tar.gz  jdk-8u201-linux-x64.rpm    3. #切換至/opt下,安裝JDK  cd /opt  rpm -ivh jdk-8u201-linux-x64.rpm  ​  4. #設定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    #修改系統變數,將定義的變數加入全域性,並且在原先的PATH路徑變數前面,因為我們已經有了131版本的JDK,如果放在PATH後面,會優先找到131的JDK檔案(linux查詢可執行檔案是根據PATH變數從左往右查詢,找到即停止。

source /etc/profile.d/java.sh     #重新整理檔案,使立即生效  java -version                     #再次檢視JDK版本

--------------------------------小知識-------------------------------------------------------------------  CLASSPAT :編譯、執行Java程式時,JRE會去該變數指定的路徑中搜索所需的類(.class)檔案。  JDK :java development kit (java開發工具)  JRE :java runtime environment (java執行時環境)  JVM :java virtuak machine (java虛擬機器),使java程式可以在多種平臺上執行class檔案。  ----------------------------------------------------------------------------------------------------------

```

寫一個java程式碼測試java是否安裝完成:

#使用文字工具編寫java原始碼  vim Hello.java  public class Hello {     public static void main(String[] args){         System.out.println("Hello World!");     }  }  ​  #對原始碼進行編譯  javac Hello.java  ​  #執行  java Hello

安裝並啟動tomcat

1. #安裝tomcat  cd /opt  tar zxf apache-tomcat-9.0.16.tar.gz    #解壓tomcat安裝包  #將解壓後的原始碼包目錄拷貝至/usr/local/下並重命名為tomcat  mv apache-tomcat-9.0.16 /usr/local/tomcat  ​  2. ##啟動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  ​  3. #瀏覽器訪問測試  瀏覽器訪問Tomcat的預設主頁 http://192.168.235.10:8080  ​  ​  #啟動Tomcat的方法:  startup.sh          #後臺啟動tomcat  catalina.sh start   #後臺啟動tomcat  catalina.sh run     #前臺啟動 tomcat  #關閉Tomcat的方法:  shutdown.sh     關閉tomcat  #檢視tomcat是否啟動:  netstat ss ps jps

tomcat常用檔案

  • 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日誌
  • temp 存放Tomcat執行時產生的檔案
  • webapps 存放專案資源的目錄
  • work Tomcat工作目錄,一般清除Tomcat快取的時候會使用到

優化tomcat啟動速度

第一次啟動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 小知識:

``` ●tomcat 啟動慢的原因是隨機數產生遭到阻塞,遭到阻塞的原因是:熵池大小 。

●/dev/random: 阻塞型,讀取它就會產生隨機資料,但該資料取決於熵池噪聲,當熵池空了,對/dev/random 的讀操作也將會被阻塞。

●/dev/urandom: 非阻塞的隨機數產生器,它會重複使用熵池中的資料以產生偽隨機資料。 這表示對/dev/urandom的讀取操作不會產生阻塞,但其輸出的熵可能小於/dev/random的。 它可以作為生成較低強度密碼的偽隨機數生成器,不建議用於生成高強度長期密碼。

●Linux核心採用熵來描述資料的隨機性。熵(entropy)是描述系統混亂無序程度的物理量, 一個系統的熵越大則說明該系統的有序性越差,即不確定性越大。 在資訊學中,熵被用來表徵一個符號或系統的不確定性,熵越大,表明系統所含有用資訊量越少,不確定度越大。 計算機本身是可預測的系統,因此,用計算機演算法不可能產生真正的隨機數。但是機器的環境中充滿了各種各樣的噪聲, 如硬體裝置發生中斷的時間,使用者點選滑鼠的時間間隔等是完全隨機的,事先無法預測。 Linux核心實現的隨機數產生器正是利用系統中的這些隨機噪聲來產生高質量隨機數序列。 核心維護了一個熵池用來收集來自裝置驅動程式和其它來源的環境噪音。 理論上,熵池中的資料是完全隨機的,可以實現產生真隨機數序列。 為跟蹤熵池中資料的隨機性,核心在將資料加入池的時候將估算資料的隨機性,這個過程稱作熵估算。 熵估算值描述池中包含的隨機數位數,其值越大表示池中資料的隨機性越好。

​  /dev/random 隨機數  /dev/urandom 偽隨機數 ```

配置虛擬主機

基於埠

修改配置檔案

``` [root@server1 ~]# vi /usr/local/tomcat8/conf/server.xml

[root@server1 ~]# tomcatdown [root@server1 ~]# tomcatup

[root@server1 ~]# netstat -anpt | grep 8080 ###檢視8080埠是否開啟 tcp6 0 0 :::8080 ::: LISTEN 51036/java [root@server1 ~]# netstat -anpt | grep 8081 ###檢視8081埠是否開啟 tcp6 0 0 :::8081 ::: LISTEN 51036/java ```

基於域名

  1. 建立主頁並修改主頁內容

``` [root@server1 ~]# mkdir -p /web/webapp1/test1 [root@server1 ~]# mkdir -p /web/webapp1/test2 [root@server1 ~]# vi /web/webapp1/test1/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> JSP test1 page

<% out.println("Welcome to test site,http://www.test1.com");%>
動態頁面

[root@server1 ~]# vi /web/webapp1/test2/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> JSP test2 page

<% out.println("Welcome to test site,http://www.test2.com");%>
動態頁面

``` 2. 修改Tomcat主配置檔案

``` [root@server1 ~]# vi /usr/local/tomcat8/conf/server.xml

   <Host name="www.test2.com"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
    <Context docBase="/web/webapp1/test2" path="" reloadable="false" />
  </Host>

[root@server1 ~]# tomcatdown [root@server1 ~]# tomcatup [root@server1 ~]# netstat -anpt | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 49329/java

``` 3. 本地增加對映

``` [root@server1 ~]# vi /etc/hosts 192.168.235.10 www.test1.com www.test2.com

``` 4. 驗證

2021040622165344.png

20210406221643702.png