前言 以前總是採用很Low的方式太同一臺伺服器上部署多個Web應用,步驟是這樣的:Copy Tomcat目錄-->更改conf/server.xml三個埠號 >部署war包 >分別啟動訪問。 這樣是最簡單的方式,但事實上是不推薦的,因為如果伺服器資源有限,需要部署的應用數目一旦增加,會給伺服器帶來 ...
前言
以前總是採用很Low的方式太同一臺伺服器上部署多個Web應用,步驟是這樣的:Copy Tomcat目錄-->更改conf/server.xml三個埠號----->部署war包----->分別啟動訪問。
這樣是最簡單的方式,但事實上是不推薦的,因為如果伺服器資源有限,需要部署的應用數目一旦增加,會給伺服器帶來負擔,我們可以充分利用Tomcat伺服器的性能,減少資源浪費。具體的做法就是採用“Tomcat多實例”部署多應用:創建Tomcat多實例---->更改conf/server.xml三個埠號----->部署應用------>編寫啟動/關閉腳本------->分別啟動實例並訪問。在動手實踐之前,需要對一些基本概念清楚,比如$CATALINA_HOME與$CATALINA_BASE分別指?webapps下的example、docs、ROOT目錄能刪除嗎?
參考資料《Tomcat架構解析》(我這裡只有帶標簽的PDF電子版,有需要的小伙伴也可以私信或者評論我)
一、Tomcat部署的基本概念
1. CATALINA_HOME與CATALINA_BASE分別指什麼?
CATALINA_HOME指的是Tomcat的安裝目錄,在Windows下Tomcat的安裝目錄如下:
bin:Tomcat一些腳本存放目錄,比如啟動腳本startup.bat/startup.sh等
conf:Tomcat配置文件所在目錄,最主要的就是server.xml與web.xml
lib:主要存放Tomcat依賴包
logs:Tomcat日誌所在目錄。以為catalina、host-manager等開頭日誌
temp:存放Tomcat運行時的臨時文件,通常放一些緩存文件,一般不要刪除
webapps:應用部署所在目錄,就是在這裡存放我們需要部署的文件目錄、WAR包
work:存放由JSP文件生成的Servlet
RUNNING.txt:運行說明,必需的一些環境信息
NOTICE:通知信息,軟體的版權信息等
RELEASE-NOTES:發佈說明,比如版本升級的功能說明
LICENSE:版權許可證,軟體版權信息
CATALINA_BASE指的是Tomcat的實例所在目錄,Tomcat的實例由除了bin、lib外的目錄組成
兩者的對比圖如下一目瞭然,那麼接下來配置多實例,也只需要Copy相應的目錄組成新的Tomcat實例即可。
2. conf目錄下的配置文件具體用來做什麼?
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應用進行管理。
3. webapps下的目錄哪些可以刪除?
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文檔中心,不影響應用部署,可以刪除
4. Tomcat為了避免埠衝突需要更改哪些埠?
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鏈接器監聽埠即可
5. Tomcat部署應用的方式有哪幾種?
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壓縮包。
1. 部署安裝Tomcat
在已經由JDK環境的CentOS下解壓tomcat包即可
解壓命令如下:
tar -zxvf apache-tomcat-9.0.14.tar.gz
2. 創建多實例
創建tomcat_instance存放tomcat_1、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
3. 更改埠
進入tomcat_1/conf與tomcat_2/conf/下更改server.xml埠的SHUTDOWN命令監聽埠與Connector鏈接器監聽埠
tomcat_1/conf/server.xml:
tomcat_2/conf/server.xml
4. 編寫腳本
創建啟動、關閉腳本(也可以重啟腳本),進入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
5. 部署應用
部署應用就跟平常一樣在webapps下部署,或者context.xml描述文件映射等,我們現在為了測試,簡單引入html文件到ROOT目錄下,啟動之後分別訪問http://{ip}:8081、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>
6. 啟動應用
啟動腳本,傳入正確實例路徑,啟動兩個tomcat實例。
啟動tomcat實例1
啟動tomcat實例2
7. 訪問應用
訪問http://{ip}:8081
訪問http://{ip}:8082