之前老是採用很Low的方式太同一臺服務器上部署多個Web應用,步驟是這樣的:Copy Tomcat目錄-->更改conf/server.xml三個端口號----->部署war包----->分別啓動訪問。html
這樣是最簡單的方式,但事實上是不推薦的,由於若是服務器資源有限,須要部署的應用數目一旦增長,會給服務器帶來負擔,咱們能夠充分利用Tomcat服務器的性能,減小資源浪費。具體的作法就是採用「Tomcat多實例」部署多應用:建立Tomcat多實例---->更改conf/server.xml三個端口號----->部署應用------>編寫啓動/關閉腳本------->分別啓動實例並訪問。在動手實踐以前,須要對一些基本概念清楚,好比$CATALINA_HOME與$CATALINA_BASE分別指?webapps下的example、docs、ROOT目錄能刪除嗎?java
參考資料《Tomcat架構解析》(我這裏只有帶標籤的PDF電子版,有須要的小夥伴也能夠私信或者評論我)web
CATALINA_HOME指的是Tomcat的安裝目錄,在Windows下Tomcat的安裝目錄以下:shell
bin:Tomcat一些腳本存放目錄,好比啓動腳本startup.bat/startup.sh等apache
conf:Tomcat配置文件所在目錄,最主要的就是server.xml與web.xml緩存
lib:主要存放Tomcat依賴包tomcat
logs:Tomcat日誌所在目錄。覺得catalina、host-manager等開頭日誌服務器
temp:存放Tomcat運行時的臨時文件,一般放一些緩存文件,通常不要刪除架構
webapps:應用部署所在目錄,就是在這裏存放咱們須要部署的文件目錄、WAR包app
work:存放由JSP文件生成的Servlet
RUNNING.txt:運行說明,必需的一些環境信息
NOTICE:通知信息,軟件的版權信息等
RELEASE-NOTES:發佈說明,好比版本升級的功能說明
LICENSE:版權許可證,軟件版權信息
CATALINA_BASE指的是Tomcat的實例所在目錄,Tomcat的實例由除了bin、lib外的目錄組成
二者的對比圖以下一目瞭然,那麼接下來配置多實例,也只須要Copy相應的目錄組成新的Tomcat實例便可。
Tomcat的配置須要分爲:JVM配置、服務器配置、Web應用配置、Tomcat管理配置四個方面(其中JVM的配置通常在catalina.sh/catalina.bat中配置,這裏不作介紹),這裏只作簡單的介紹,不會具體介紹Tomcat配置
1)服務器配置
服務器配置主要集中於$CATALINA_HOME/conf下的catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml文件。
2)Web應用配置
web.xml是Web應用的部署描述文件,它支持的元素及屬性來自於Servlet規範定義。在Tomcat中,Web應用的部署描述信息包括$CATALINA_BASE/conf/web.xml中的默認配置。
Tomcat的默認配置比Web應用定製配置負責不少,若是是徹底基於JSP的Web應用不須要添加任何定製配置。主要包括ServletContext的初始化參數、會話配置、Filter定義與映射等
3)Tomcat管理配置
主要是針對host-manager 與manager兩個功能進行配置,在Tomcat中咱們能夠針對虛擬主機進行配置,也能夠對咱們的Web應用進行管理。
Windows下查看webapps下的,包括docs、ROOT、manager、host-manager、examples。webapps不必定是Tomcat部署web應用惟一的地方,能夠在任何一處,但只須要作好映射便可(context.xml描述文件或者Host的appBase屬性能夠作到)
事實上,所有均可以刪除。爲何呢?這是由於
1)ROOT:Tomcat自己默認的訪問http://{ip}:{port},也就是訪問http://127.0.0.1:8080標誌性的Tomcat首頁所在之處
2)manager:訪問http://{ip}:{port}/manager/html,能夠管理部署應用(固然須要配置tomcat-users.xml文件)。通常部署Web應用每每是不須要的
3)host-manager:訪問http://{ip}:{port}/host-manager/html,能夠管理配置Host虛擬主機。通常簡單web應用部署也不會用到
4)examples:Servlet、JSP、WebSocket示例,展現在Tomcat下如何使用等,訪問http://{ip}:{port}/examples/index.html便可進入。也是不須要的,能夠刪除
5)docs:Tomcat HTML文檔中心,不影響應用部署,能夠刪除
1)Server Port:該端口用於監聽關閉tomcat的shutdown命令,默認爲8005
<Server port="8006" shutdown="SHUTDOWN">
2)Connector Port:該端口用於監聽HTTP的請求,默認爲8080
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
3)AJP Port:該端口用於監聽AJP( Apache JServ Protocol )協議上的請求,一般用於整合Apache Server等其餘HTTP服務器,默認爲8009。實際上能夠不用管,由於AJP基本用不到,特別是Ngxin與Tomcat集成時(Nginx沒有響應的支持AJP模塊,只有第三方模塊支持AJP協議)
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
4)Redirect Port:重定向端口,出如今Connector配置中,若是該Connector僅支持非SSL的普通http請求,那麼該端口會把 https 的請求轉發到這個Redirect Port指定的端口,默認爲8443;
簡單的應用部署爲避免端口衝突,實際上只須要更改SHUTDOWN監聽端口與Connector連接器監聽端口便可
1) Context描述文件部署
Tomcat支持經過一個獨立的Context描述文件配置並啓動Web應用,該文件的存儲路徑由Hot中xmlBase屬性指定,若不指定,則默認CATALINA_BASE/conf/<Engine名稱>/<Host名稱>,對於Tomcat默認的就是CATALINA_BASE/conf/Catalina/localhost
其實也就是conf/context.xml文件:Tomcat啓動時即會自動部署該Web應用
2) Web部署
即便以目錄的形式發佈部署Web應用,複製到Host指定appBase目錄下便可完成部署。
3) WAR包部署
xxx.war包解壓成目錄形式而已,
主要以apache-tomcat-9.0.14爲例,下載tar壓縮包。
在已經由JDK環境的CentOS下解壓tomcat包便可
解壓命令以下:
tar -zxvf apache-tomcat-9.0.14.tar.gz
建立tomcat_instance存放tomcat_一、tomcat_2與tomcat_bin腳本
建立tomcat_1與tomcat_2實例,將conf webapps等文件copy到實例下的命令:
mkdir tomcat_instance tomcat_instance/tomcat_1 tomcat_instance/tomcat_2 tomcat_instance/tomcat_bin cd apache-tomcat-9.0.14 mv conf/ webapps/ temp/ logs/ work/ -t ../tomcat_1 mv conf/ webapps/ temp/ logs/ work/ -t ../tomcat_2
進入tomcat_1/conf與tomcat_2/conf/下更改server.xml端口的SHUTDOWN命令監聽端口與Connector連接器監聽端口
tomcat_1/conf/server.xml:
tomcat_2/conf/server.xml
建立啓動、關閉腳本(也能夠重啓腳本),進入tomcat_bin/ 分別建立startup.sh與shutdown.sh
startup.sh的shell腳本代碼以下:
# 指定CATALINA_HOME
export CATALINA_HOME=/home/tomcat/apache-tomcat-9.0.14
# 經過參數的形式輸入tomcat實例路徑 export CATALINA_BASE=${1%/} echo $CATALINA_BASE
# 找到tomcat實例的進程ID TOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'` if [ -n "$TOMCAT_ID" ] ; then echo "tomcat(${TOMCAT_ITOMCAT_ID}) is running now , please shutdown it!"; exit 2; fi TOMCAT_START_LOG=`$CATALINA_HOME/bin/startup.sh` if [ "$?" = "0" ]; then echo "$0 ${1%/} start succeed" else echo "$0 ${1%/} start failed" echo $TOMCAT_START_LOG fi
shutdown.sh的腳本代碼以下:
export CATALINA_HOME=/home/tomcat/apache-tomcat-9.0.14 export CATALINA_BASE=${1%/} echo $CATALINA_BASE TOMCAT_ID=`ps aux |grep "java"|grep "[D]catalina.base=$CATALINA_BASE "|awk '{ print $2}'` if [ -n "$TOMCAT_ID" ] ; then TOMCAT_STOP_LOG=`$CATALINA_HOME/bin/shutdown.sh` else echo "Tomcat instance not found : ${1%/}" exit fi if [ "$?" = "0" ]; then echo "$0 ${1%/} stop succeed" else echo "$0 ${1%/} stop failed" echo $TOMCAT_STOP_LOG fi
部署應用就跟日常同樣在webapps下部署,或者context.xml描述文件映射等,咱們如今爲了測試,簡單引入html文件到ROOT目錄下,啓動以後分別訪問http://{ip}:808一、http://{ip}:8082
tomcat實例1 index.jsp首頁
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Tomcat 多實例測試</title> </head> <body> <h1>Tomcat Instance 1</h1> </body> </html>
tomcat實例2 index.jsp首頁
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Tomcat 多實例測試</title> </head> <body> <h1>Tomcat Instance 2</h1> </body> </html>
啓動腳本,傳入正確實例路徑,啓動兩個tomcat實例。
啓動tomcat實例1
啓動tomcat實例2
訪問http://{ip}:8081
訪問http://{ip}:8082