1. 程式人生 > 其它 >Blog.052 Tomcat 服務 部署與優化

Blog.052 Tomcat 服務 部署與優化

本章目錄

1. Tomcat概述
  1.1 Tomcat 構成元件
  1.2 Tomcat 頂層架構
  1.3 Tomcat 請求過程
2. Tomcat 服務部署
  2.1 部署步驟
  2.2 部署流程
3. Tomcat 虛擬主機配置
  3.1 配置步驟
  3.2 配置流程
  3.3 配置引數優化

1. Tomcat概述

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


  1.1 Tomcat 構成元件

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

  • Web 容器:完成 Web 伺服器的功能。
  • Servlet 容器:名字為 catalina,用於處理 Servlet 程式碼。

    Servlet 是執行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 伺服器上的資料庫或應用程式之間的中間層。
    使用Servlet,可以收集來自網頁表單的使用者輸入,呈現來自資料庫或者其他源的記錄,還可以動態建立網頁。
    與CGI(公共閘道器介面)功能相類似。

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

    JSP 全稱 Java Server Pages,是一種動態網頁開發技術。它使用 JSP 標籤在 HTML 網頁中插入 Java 程式碼。標籤通常以<%開頭,以%>結束。
    JSP 是一種 Java servlet,主要用於實現 Java web 應用程式的使用者介面部分。
    JSP 通過網頁表單獲取使用者輸入資料、訪問資料庫及其他資料來源,然後動態地建立網頁。


  1.2 Tomcat 頂層架構

  • Tomcat中最頂層的容器是Server,代表著整個伺服器,一個Server可以包含至少一個Service,用於具體提供服務。
  • Service主要包含兩個部分:Connector和Container。Tomcat的心臟就是這兩個元件,這兩個元件的作用:Connector用於處理連線相關的事情,並提供Socket與Request和Response相關的轉化; Conta iner用於封裝和管理Servlet,以及具體處理Request請求。
  • 一個Tomcat中只有一個Server,一個Server可以包含多個Service,一個Service只有一個Container,但是可以有多個Connectors,因為一個服務可以有多個連線,如同時提供Http和Https連結,也可以提供向相同協議不同埠的連線。
  • 多個Connector和一個Container就形成了一個Service,有了Service就可以對外提供服務了,但是Service還要一個生存的環境,必須要有人能夠給它生命、掌握其生死大權,那就非Server莫屬了!所以整個Tomcat的生命週期由Server控制。另外,上述的包含關係或者說是父子關係,都可以在tomcat的conf目錄下的server .xml配置檔案中看出。
  • server.xm1中定義<Server port=“8005” shutdown=“SHUTDOWN”>這會讓Tomcat6啟動一個server例項(即一個JVM),它監聽在8005埠以接收“SHUTDOWN”命令,如果接收到了就會關閉Tomcat。各Server的定義不能使用同一個埠,這意味著如果在同一個物理機上啟動了多個Server例項,必須配置它們使用不同的埠。

    四個子容器的作用分別是:

  • Engine:引擎,用來管理多個站點,一個Service最多隻能有一個Engine;
  • Host:代表一個站點,也可以叫虛擬主機,通過配置Host就可以新增站點;
  • Context:代表一個應用程式,對應著平時開發的一套程式,或者一個WEB-INF目錄以及下面的 web.xml 檔案;
  • Wrapper:每一Wrapper封裝著 一個Servlet。

  1.3 Tomcat 請求過程

    (1)使用者在瀏覽器中輸入該網址,請求被髮送到本機埠8080,被在那裡監聽的 Coyote HTTP/1.1 Connector 獲得;
    (2)Connector 把該請求交給它所在的 Service 的 Engine (Container) 來處理,並等待Engine的迴應;
    (3)Engine 獲得請求 localhost/test/index.jsp,匹配所有的虛擬主機 Host;
    (4)Engine 匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機),名為localhostHost獲得請求 /test/index.jsp,匹配它所擁有的所有 Context。Host 匹配到路徑為 /test 的Context (如果匹配不到就把該請求交給路徑名為“ ”的 Context 去處理;
    (5)path="/test" 的 Context 獲得請求 /index. jsp,在它的 mapping table 中尋找出對應的 Servlet。Context 匹配到 URLPattern 為* .jsp 的 Servlet,對應於JspServlet 類;
    (6)構造 HttpServletRequest 物件和 HttpServletResponse 物件,作為引數呼叫JspServlet 的 doGet() 或 doPost(),執行業務邏輯、資料儲存等;
    (7)Context 把執行完之後的 HttpServletResponse 物件返回給 Host;
    (8)Host 把 HttpServletResponse 物件返回給 Engine;
    (9)Engine 把 HttpServletResponse 物件返回 Connector;
    (10)Connector 把 HttpServletResponse 物件返回給客戶 Browser。


2. Tomcat 服務部署
  2.1 部署步驟

    在部署 Tomcat 之前必須安裝好 jdk,因為 jdk 是 Tomcat 執行的必要環境。

    (1)關閉防火牆,將安裝 Tomcat 所需軟體包傳到/opt目錄下

1 jdk-8u201-linux-x64.rpm
2 apache-tomcat-9.0.16.tar.gz
3 
4 systemctl stop firewalld
5 systemctl disable firewalld
6 setenforce 0

    (2)安裝 JDK

1 cd /opt
2 rpm -qpl jdk-8u201-linux-x64.rpm 
3 rpm -ivh jdk-8u201-linux-x64.rpm 
4 java -version                            #可以檢視到java的版本:"1.8.0_131"是預設自帶的

    (3)設定 JDK 環境變數

1 vim /etc/profile.d/java.sh
2 
3 export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
4 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar                        
5 export PATH=$JAVA_HOME/bin:$PATH
6 
7 source /etc/profile.d/java.sh
8 java -version

    Tips:

  • CLASSPATH:編譯、執行Java程式時,JRE會去該變數指定的路徑中搜索所需的類(.class)檔案。
  • dt.jar:是關於執行環境的類庫,主要是 swing 的包。
  • tools.jar:主要是一些jdk工具的類庫,包括javac,java,javap,javadoc等。
  • JDK :java development kit (java開發工具)
  • JRE :java runtime environment (java執行時環境)
  • JVM :java virtuak machine (java虛擬機器),使java程式可以在多種平臺上執行class檔案。


    (4)安裝啟動 Tomcat

 1 cd /opt
 2 
 3 tar zxvf apache-tomcat-9.0.16.tar.gz
 4 mv apache-tomcat-9.0.16 /usr/local/tomcat
 5 
 6 ## 啟動tomcat ##
 7 
 8 #後臺啟動
 9 /usr/ local/ tomcat/bin/startup.sh
10 11 /usr/ local /tomcat/bin/catalina.sh start
12 
13 #前臺啟動
14 /usr/local/tomcat/bin/catalina.sh run
15 16 /usr/local/tomcat/bin/startup.sh 
17 
18 netstat -natp | grep 8080                            #檢視8080埠是否開啟

    (5)優化 tomcat 啟動速度

## 第一次啟動檢視日誌會發現 Tomcat 啟動很慢,預設情況下可能會需要幾十秒,可以修改jdk引數。 ##

vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security

--117行--修改
securerandom.source=file:/dev/urandom

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

ll /usr/local/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 快取的時候會使用到


  2.2 部署流程

    (1)關閉防火牆,將安裝 Tomcat 所需軟體包傳到/opt目錄下


    (2)安裝 JDK


    (3)設定 JDK 環境變數


    (4)安裝啟動 Tomcat


    (5)優化 tomcat 啟動速度


3. Tomcat 虛擬主機配置

    使用環境:很多時候公司會有多個專案需要執行,那麼肯定不可能是一臺伺服器上執行多個Tomcat服務,這樣會消耗太多的系統資源。此時,就需要使用到 Tomcat 虛擬主機。例如現在新增兩個域名,希望通過這兩個域名訪問到不同的專案內容。


  3.1 配置步驟

    (1)建立專案目錄和檔案

1 mkdir /usr/local/tomcat/webapps/kgc
2 mkdir /usr/local/tomcat/webapps/benet
3 echo "This is kgc page\!" > /usr/local/tomcat/webapps/kgc/index.jsp
4 echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp

    (2)修改 Tomcat 主配置檔案

 1 vim /usr/local/tomcat/conf/server.xml
 2 
 3 --165行前--插入
 4 <Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
 5     <Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true" />
 6 </Host>
 7 
 8 <Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
 9     <Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
10 </Host>
11 
12 /usr/local/tomcat/bin/shutdown.sh
13 /usr/local/tomcat/bin/startup.sh
  • Host name :主機名
  • appBase :Tomcat程式工作目錄,相對路徑為webapps,絕對路徑為/usr/local/tomcat/webapps
  • unpackWARs :是否解壓war包
  • autoDeploy :指示Tomcat執行時,如有新的WEB應用是否允許自動部署
  • xmlValidation :是否驗證xml檔案執行有效性檢驗的標誌
  • xmlNamespaceAware :是否啟用xml名稱空間,設定該值與xmlValidation為true,表示對web.xml檔案執行有效性檢驗
  • appBase :WEB應用的目錄
  • path :設定訪問的URI為WEB應用的根目錄
  • reloadable :是否在程式有改動時重新載入


    (3)客戶端瀏覽器訪問驗證

1 echo "192.168.---.--- www.kgc.com www.benet.com" >> /etc/hosts

  3.2 配置流程

    (1)建立專案目錄和檔案


    (2)修改 Tomcat 主配置檔案


    (3)客戶端瀏覽器訪問驗證


  3.3 配置引數優化

    Tomcat 預設安裝下的預設配置並不適合生產環境,它可能會頻繁出現假死現象需要重啟,只有通過不斷壓測優化才能讓它最高效率穩定的執行。
    優化主要包括三方面,分別為作業系統優化(核心引數優化),Tomcat配置檔案引數優化,Java虛擬機器(JVM)調優。


    常用的優化相關引數如下:

【maxThreads】 Tomcat 使用執行緒來處理接收的每個請求,這個值表示 Tomcat 可建立的最大的執行緒數,預設值是 200。
【minSpareThreads】 最小空閒執行緒數,Tomcat 啟動時的初始化的執行緒數,表示即使沒有人使用也開這麼多空執行緒等待,預設值是 10。
【maxSpareThreads】

最大備用執行緒數,一旦建立的執行緒超過這個值,Tomcat就會關閉不再需要的socket執行緒。預設值是-1(無限制)。

一般不需要指定。

【URIEncoding】 指定 Tomcat 容器的 URL 編碼格式,語言編碼格式這塊倒不如其它 Web伺服器軟體配置方便,需要分別指定。
【connnectionTimeout】

網路連線超時,單位:毫秒,設定為 0 表示永不超時,這樣設定有隱患。

通常預設 20000 毫秒就可以。

【enableLookups】

是否反查域名,以返回遠端主機的主機名。

取值為:true 或 false,如果設定為 false,則直接返回 IP 地址,為了提高處理能力,應設定為 false

【disableUploadTimeout】

上傳時是否使用超時機制。

應設定為 true。

【connectionUploadTimeout】

上傳超時時間,畢竟檔案上傳可能需要消耗更多的時間,這個根據你自己的業務需要自己調,以使Servlet有較長的時間來完成它的執行,需要與上一個引數一起配合使用才會生效。

【acceptCount】 指定當所有可以使用的處理請求的執行緒數都被使用時,可傳入連線請求的最大佇列長度,超過這個數的請求將不予處理,預設為 100 個。
【compression】

是否對響應的資料進行GZIP壓縮。

off:表示禁止壓縮。

on:表示允許壓縮(文字將被壓縮)、force:表示所有情況下都進行壓縮,預設值為 off,壓縮資料後可以有效的減少頁面的大小,一般可以減小 1/3 左右,節省頻寬。

【compressionMinSize】 表示壓縮響應的最小值,只有當響應報文大小大於這個值的時候才會對報文進行壓縮,如果開啟了壓縮功能,預設值就是 2048。
【compressableMimeType】 壓縮型別,指定對哪些型別的檔案進行資料壓縮。
【noCompressionUserAgents=“gozilla, traviata”】 對於以下的瀏覽器,不啟用壓縮。

-