面試BAT大廠必知的Tomcat容器

  • 2020 年 3 月 26 日
  • 筆記

預計閱讀時間: 10分鐘

一、Tomcat各組件

1、認識Tomcat

Tomcat是一個基於JAVA的WEB容器,其實現了JAVA EE中的 Servlet 與 jsp 規範,與Nginx apache 伺服器不同在於一般用於動態請求處理。在架構設計上採用面向組件的方式設計。即整體功能是通過組件的方式拼裝完成。另外每個組件都可以被替換以保證靈活性。

那麼是哪些組件組成了Tomcat呢?

2.Tomcat 各組件及關係

  • Server 和 Service
  • Connector 連接器
    • HTTP 1.1
    • SSL https
    • AJP( Apache JServ Protocol) apache 私有協議,用於apache 反向代理Tomcat
  • Container
    • Engine 引擎 catalina
    • Host 虛擬機 基於域名 分發請求
    • Context 隔離各個WEB應用 每個Context的 ClassLoader都是獨立
  • Component
    • Manager (管理器)
    • logger (日誌管理)
    • loader (載入器)
    • pipeline (管道)
    • valve (管道中的閥)

3.Tomcat啟動參數說明

我們平時啟動Tomcat過程是怎麼樣的?

  1. 複製WAR包至Tomcat webapp 目錄。
  2. 執行starut.bat 腳本啟動。
  3. 啟動過程中war 包會被自動解壓裝載。

但是我們在Eclipse 或idea 中啟動WEB項目的時候 也是把War包複雜至webapps 目錄解壓嗎?顯然不是,其真正做法是在Tomcat程式文件之外創建了一個部署目錄,在一般生產環境中也是這麼做的 即:Tomcat 程式目錄和部署目錄分開 。我們只需要在啟動時指定CATALINA_HOME 與 CATALINA_BASE 參數即可實現。

啟動參數

描述說明

JAVA_OPTS

jvm 啟動參數 , 設置記憶體 編碼等 -Xms100m -Xmx200m -Dfile.encoding=UTF-8

JAVA_HOME

指定jdk 目錄,如果未設置從java 環境變數當中去找。

CATALINA_HOME

Tomcat 程式根目錄

CATALINA_BASE

應用部署目錄,默認為$CATALINA_HOME

CATALINA_OUT

應用日誌輸出目錄:默認$CATALINA_BASE/log

CATALINA_TMPDIR

應用臨時目錄:默認:$CATALINA_BASE/temp

可以編寫一個腳本 來實現自定義配置: 演示自定義啟動Tomcat

  • 下載並解壓Tomcat
  • 創建並拷貝應用目錄
  • 創建Tomcat.sh
    • 編寫Tomcat.sh
    • chmod +x tomcat.sh 添加執行許可權
  • 拷貝conf 、webapps 、logs至應用目錄。
  • 執行啟動測試。
#!/bin/bash  export JAVA_OPTS="-Xms100m -Xmx200m"  export JAVA_HOME=/root/svr/jdk/  export CATALINA_HOME=/usr/local/apache-tomcat-8.5.34  export CATALINA_BASE="`pwd`"    case $1 in          start)          $CATALINA_HOME/bin/catalina.sh start                  echo start success!!          ;;          stop)                  $CATALINA_HOME/bin/catalina.sh stop                  echo stop success!!          ;;          restart)          $CATALINA_HOME/bin/catalina.sh stop                  echo stop success!!                  sleep 2          $CATALINA_HOME/bin/catalina.sh start          echo start success!!          ;;          version)          $CATALINA_HOME/bin/catalina.sh version          ;;          configtest)          $CATALINA_HOME/bin/catalina.sh configtest          ;;          esac  exit 0  

二、Tomcat server.xml 配置

Server 的基本基本配置:

<Server>      <Listener /><!-- 監聽器 -->      <GlobaNamingResources> <!-- 全局資源 -->      </GlobaNamingResources      <Service>          <!-- 服務 用於 綁定 連接器與 Engine -->          <Connector 8080/> <!-- 連接器-->          <Connector 8010 /> <!-- 連接器-->          <Connector 8030/> <!-- 連接器-->            <Engine>      <!-- 執行引擎-->              <Logger />              <Realm />                 <host "www.tl.com" appBase="">  <!-- 虛擬主機-->                     <Logger /> <!-- 日誌配置-->                     <Context "/luban" path=""/> <!-- 上下文配置-->                 </host>          </Engine>      </Service>  </Server>  

元素說明: **server ** root元素:server 的頂級配置 主要屬性: port:執行關閉命令的埠號 shutdown:關閉命令

  • 演示shutdown的用法
#基於telent 執行SHUTDOWN 命令即可關閉  telent 127.0.0.1 8005  SHUTDOWN  

service 服務:將多個connector 與一個Engine組合成一個服務,可以配置多個服務。

Connector 連接器:用於接收 指定協議下的連接 並指定給唯一的Engine 進行處理。主要屬性:

  • protocol 監聽的協議,默認是http/1.1
  • port 指定伺服器端要創建的埠號
  • minThread 伺服器啟動時創建的處理請求的執行緒數
  • maxThread 最大可以創建的處理請求的執行緒數
  • enableLookups 如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址
  • redirectPort 指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號
  • acceptCount 指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理
  • connectionTimeout 指定超時的時間數(以毫秒為單位)
  • SSLEnabled 是否開啟 sll 驗證,在Https 訪問時需要開啟。
  • 演示配置多個Connector
 <Connector port="8860" protocol="org.apache.coyote.http11.Http11NioProtocol"                  connectionTimeout="20000"                  redirectPort="8862"                  URIEncoding="UTF-8"                  useBodyEncodingForURI="true"                  compression="on" compressionMinSize="2048"  compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript"                  maxThreads="1024" minSpareThreads="200"                  acceptCount="800"                  enableLookups="false"          />  

Engine 引擎:用於處理連接的執行器,默認的引擎是catalina。一個service 中只能配置一個Engine。主要屬性:name 引擎名稱 defaultHost 默認host

Host 虛擬機:基於域名匹配至指定虛擬機。類似於nginx 當中的server,默認的虛擬機是localhost. 主要屬性:

  • 演示配置多個Host
<Host name="www.luban.com"  appBase="/usr/www/luban"              unpackWARs="true" autoDeploy="true">          <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"               prefix="www.luban.com.access_log" suffix=".txt"                 pattern="%h %l %u %t &quot;%r&quot; %s %b" />  </Host>  

Context 應用上下文:一個host 下可以配置多個Context ,每個Context 都有其獨立的classPath。相互隔離,以免造成ClassPath 衝突。主要屬性:

  • 演示配置多個Context
<Context docBase="hello" path="/h" reloadable="true"/>  

Valve 閥門:可以理解成request 的過濾器,具體配置要基於具體的Valve 介面的子類。以下即為一個訪問日誌的Valve.

End

Tags: