Tomcat生產環境配置與應用
概要:
- Tomcat各核心元件認知
- server.xml 配置詳解
- 自動部署指令碼編寫
一、Tomcat各元件認知
知識點:
-
Tomcat架構說明
-
Tomcat元件及關係詳情介紹
-
Tomcat啟動引數說明
-
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 "%r" %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 "%r" %s %b" />
三、Tomcat 自動部署指令碼編寫
Tomcat啟動引數說明
我們平時啟動Tomcat過程是怎麼樣的?
- 複製WAR包至Tomcat webapp 目錄。
- 執行starut.bat 指令碼啟動。
- 啟動過程中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