1. 程式人生 > 其它 >Tomcat生產環境配置與應用

Tomcat生產環境配置與應用

概要:

  1. Tomcat各核心元件認知
  2. server.xml 配置詳解
  3. 自動部署指令碼編寫

一、Tomcat各元件認知


知識點:

  1. Tomcat架構說明

  2. Tomcat元件及關係詳情介紹

  3. Tomcat啟動引數說明

  4. 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 (管道中的閥)

二、Tomcat server.xml 配置詳解


**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
閥門:可以理解成

的過濾器,具體配置要基於具體的Valve 介面的子類。以下即為一個訪問日誌的Valve.

<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" />

三、Tomcat 自動部署指令碼編寫


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

可以編寫一個指令碼 來實現自定義配置:

更新 啟動 指令碼

#!/bin/bash
export JAVA_OPTS="-Xms100m -Xmx200m"
export JAVA_HOME=/root/svr/jdk/
export CATALINA_HOME=/root/svr/apache-tomcat-7.0.81
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 3
    $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

自動部署指令碼:

#!/bin/bash -e
export now_time=$(date +%Y-%m-%d_%H-%M-%S)
echo "deploy time:$now_time"

app=$1
version=$2
mkdir -p war/
#從svn下載程式至 war目錄
war=war/${app}_${version}.war
echo "$war"
svn export svn://192.168.0.147/release/${app}_${version}.war $war

deploy_war() {
#解壓版本至當前目錄
target_dir=war/${app}_${version}_${now_time}
unzip -q $war -d $target_dir
rm -f appwar
ln -sf $target_dir appwar
target_ln=`pwd`/appwar
echo '<?xml version="1.0" encoding="UTF-8" ?>
<Context docBase="'$target_ln'" allowLinking="false">
</Context>' > conf/Catalina/localhost/ROOT.xml
#重啟Tomcat服務
./tomcat.sh restart
}

deploy_war

tomcat.sh

deploy.sh