1.Tomcat各組件認知
Tomcat是一個基于JAVA的WEB容器,其實現(xiàn)了JAVA EE中的 Servlet 與 jsp 規(guī)范,與Nginx apache 服務器不同在于一般用于動態(tài)請求處理。在架構設計上采用面向組件的方式設計。即整體功能是通過組件的方式拼裝完成。另外每個組件都可以被替換以保證靈活性。

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

3.Tomcat server.xml 配置詳解
server
root元素:server 的頂級配置
主要屬性:
port:執(zhí)行關閉命令的端口號
shutdown:關閉命令
演示shutdown的用法
基于telent 執(zhí)行SHUTDOWN 命令即可關閉(必須大寫)
telent 127.0.0.1 8005
SHUTDOWN
service
服務:將多個connector 與一個Engine組合成一個服務,可以配置多個服務。
Connector
連接器:用于接收 指定協(xié)議下的連接 并指定給唯一的Engine 進行處理。
主要屬性:
protocol 監(jiān)聽的協(xié)議,默認是http/1.1
port 指定服務器端要創(chuàng)建的端口號
minThread 服務器啟動時創(chuàng)建的處理請求的線程數(shù)
maxThread 最大可以創(chuàng)建的處理請求的線程數(shù)
enableLookups 如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址
redirectPort 指定服務器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號
acceptCount 指定當所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理
connectionTimeout 指定超時的時間數(shù)(以毫秒為單位)
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
引擎:用于處理連接的執(zhí)行器,默認的引擎是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" />
4.Tomcat 自動部署腳本編寫

更新 啟動 腳本
#!/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
回滾修改war包對應的軟連接