一、多實例部署
主要是為了充分利用服務器資源,並且可以交叉部署應用。主要做法可以有使用docker部署,多實例部署。
多實例多應用:多個 Tomcat 部署多個不同的項目。這種模式在服務器資源有限,或者對服務器要求並不是很高的情況下,可以實現多個不同項目部署在同一台服務器上的需求,來實現資源使用的最大化
有一種做法就是簡單的復制出一個新的 Tomcat 目錄后改一下端口,這種方法應用起來也是可以的,但是會有幾個問題:
1 當你對集群中Tomcat 版本升級 如何做?
2 當你需要針對每一個不同的 Web 服務分配不用的內存時,你需要怎么做
1.1、知識點
官方建議配置多實例方法
上圖中的 CATALINA_HOME 指Tomcat安裝路徑,CATALINA_BASE 指實例所在位置。CATALINA_HOME 路徑下只需要包含 bin 和 lib 目錄,而 CATALINA_BASE 只存放 conf、webapps、logs 等這些文件,這樣部署的好處在於升級方便,配置及安裝文件間互不影響,在不影響 Tomcat 實例的前提下,替換掉 CATALINA_HOME 中的安裝文件。
1.2、腳本說明
env-conf.sh:基礎環境,
initup.sh:構建並啟動多實例
stop.sh:停止多實例
destroy.sh:停止並銷毀
index_template.html 生成一個靜態頁,測試使用
server_template.xml tomcat 實例配置
tomcat_control_template.sh 單個實例控制器
使用:env-conf.sh配置,使用initup.sh初始化,后續使用 stop.sh 停止所有,destroy.sh停止並銷毀所有
控制單個機器,進入catalina_base/bin 使用腳本:control.sh start ; control.sh stop等控制
1.3、思路說明
主要是initup.sh說明
1、按照條件創建目錄
mkdir -p /export/Instances/tomcat_instance1 mkdir -p /export/Instances/tomcat_instance2 mkdir -p /export/Instances/tomcat_instance3
2、從原始tomcat目錄拷貝實例必須目錄
{conf,logs,temp,work}
3、使用server_template.xml針對多實例配置
主要實例線程優化、目錄確定
4、tomcat控制腳本編寫
參看地址:https://github.com/bjlhx15/shell.git https://github.com/bjlhx15/shell/tree/master/cmd/centos/multi-tomcat8
1.4、注意點
1.4.1、啟動tomcat時,一直卡在Deploying web application directory這塊的解決方案
原因:linux或者部分unix系統提供隨機數設備是/dev/random 和/dev/urandom ,兩個有區別,urandom安全性沒有random高,但random需要時間間隔生成隨機數。jdk默認調用random。
解決方案:可以有兩種方式來解決:
方案一、catalina.sh 中加入這么一行:-Djava.security.egd=file:/dev/./urandom
export JAVA_OPTS="-Xms1024m -Xmx1024m \ -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8 -Des.set.netty.runtime.available.processors=false"
方案二、在JVM 環境中解決
打開 $JAVA_PATH/jre/lib/security/java.security 這個文件(在你安裝jdk的目錄下)
securerandom.source=file:/dev/random 將其替換為: securerandom.source=file:/dev/./urandom
詳細說明
發生這種情況的根本原因是 SecureRandom 這個 jre 的工具類的問題。那為什么 SecureRandom generateSeed 這么慢呢,這是因為tomcat7、tomcat8都是用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 類產生安全隨機類 SecureRandom 的實例作為會話 ID。
Tomcat 使用 SHA1PRNG 算法是基於 SHA-1 算法實現且保密性較強的偽隨機數生成器。而在 SHA1PRNG 算法中,有一個種子產生器是根據配置來執行各種操作的。
linux中的隨機數可以從兩個特殊的文件中產生,一個是 /dev/urandom,另外一個是 /dev/random。 他們產生的隨機數的原理是利用當前系統的熵池來計算出固定一定數量的隨機比特,然后再將這些比特作為字節流返回。這里的熵池就是當前系統的環境噪音,熵指的是一個系統的混亂程度,系統跟噪音可以通過很多參數來評估,如內存的使用,文件的使用量,不同類型的進程的數量等等。如果當前的系統的環境噪音變化程度並不是很劇烈、反差不大,或者當前環境的噪音很小,比如剛開機的時候。而剛開機的時候需要大量的隨機比特,這個時候產生隨機數的隨機效果就不是很理想了。
接下來解釋一下 /dev/urandom 和 /dev/random 這兩種不同的文件的區別, /dev/random 在不能產生新的隨機數的情況下會阻塞程序,程序掛起便沒法繼續執行,直到熵池產生新的隨機字節后才能返回,程序再接着執行,這就是 /dev/random 比 /dev/urandom 產生大量隨機數的速度要慢的原因,也是為什么使用這個文件生成隨機數時,tomcat啟動的速度被拖慢的原因。而 /dev/urandom 這種方式在不能產生新的隨機數時不會阻塞程序,當然了,這樣的話生成隨機數的效果沒有 /dev/random 這種方式好,這對於加解密這樣的應用來說並不是一個很好的選擇。
SecureRandom generateSeed 使用 /dev/random 生成種子。但是 /dev/random 是一個阻塞數字生成器,如果它沒有足夠的隨機數據提供,它就一直等,這迫使 JVM 等待(程序掛起/tomcat啟動拖慢)。鍵盤和鼠標輸入以及磁盤活動可以產生所需的隨機性或熵。但在一個服務器缺乏這樣的活動,可能會出現問題。
1.4.2、TOMCAT的appBase和docBase
1、appBase
server.xml文件host配置appBase,appBase這個目錄下面的子目錄將自動被部署為應用,且war文件將被自動解壓縮並部署為應用,默認為tomcat下webapps目錄,如果不想訪問默認ROOT目錄,修改這里,同理如果想訪問配置目錄下應用為默認應用,在此目錄下新增ROOT目錄文件夾。
2、docBase
也可以繼續在host下配置虛擬目錄
<Context path="" docBase="D:\WebContent" sessionCookiePath="/" sessionCookieName="JSESSIONID" />
docBase只是指向了你某個應用的目錄,這個可以和appBase沒有任何關系
如果你把他們弄重復了,也就是2個指向了一個目錄,也能運行,但應用下面的每個子目錄,其實是被部署為單獨的應用的,這就是兩者區別與聯系
1、appBase="webapps“,這是默認值,相對路徑,代表:d:\tomcat\webapps 這樣的路徑,謂之根目錄;根目錄下的 ROOT 目錄,代表默認的主目錄。
訪問: http://localhost:8080 默認找 d:\tomcat\webapps\ROOT 下的文件(前提是沒有docBase)
2、appBase=“d:\tomcat\webapps”,絕對目錄,
訪問 http://localhost:8080 返回ROOT目錄內容,
訪問http://localhost:8080/test返回d:\tomcat\webapps\test目錄內容。
3、appBase=“webapps\abc”,相對目錄,
訪問 http://localhost:8080 默認返回d:\tomcat\webapps\abc\ROOT的內容;
訪問http://localhost:8080/test返回d:\tomcat\webapps\abc\test的內容。
4、添加路徑指向docBase后,appBase 作用變化:
docBase=“test”, 訪問的是 d:\tomcat\webapps\test, appBase為根目錄;
docBase="\test", 訪問的是 d:\tomcat\webapps\test,appBase為根目錄;
docBase=“d:\test”, 訪問的是 d:\test,appBase無效;
上述test目錄必須存在,否則tomcat報錯啟動失敗。
2、Context
a>配置方式
其一、在server.xml的host中,Tomcat 盡管也允許直接在server.xml文件中配置<Context>元素,但不提倡采用這種方式。
其二、在項目啟動后,會更具配置的server.xml配置中Engine name和Host name 生成;對應二級目錄
Context中的path表示服務器端的項目名稱。可以設置為""。 docBase表示訪問的項目所在位置或項目所在父目錄的位置。
b>Context查找順序
Tomcat 提供了多種配置<Context>元素的途徑。當Tomcat 6.x加載一個 Web 應用時,會依次按照以下五種方式嘗試查找 Web 應用的<Context>元素,直到找到為止:
1)到<CATALINA_HOME>/conf/context.xm文件中查找<Context>元素。這個文件中的<Context>元素的信息適用於所有Web應用。
2)到<CATALINA_HOME>/conf/[enginename]/[hostname]/context.xml.default 文件中查找<Context>元素。[enginename]表示<Engine>的 name 屬性,[hostname]表示<Host>的name屬性。在context.xml.default文件中的<Context>元素的信息適用於當前虛擬主機中的所有Web應用
例如以下文件中的<Context>元素適用於名為Catalina的Engine下的localhost主機中的所有Web應用:
<CATALINA_HOME>/conf/Catalina/localhost/context.xml.default
3)到<CATALINA_HOME>/conf/[enginename]/[hostname]/[contextpath].xml文件中查找<Context>元素。[contextpath]表示單個Web應用的URL入口。在[contextpath].xml文件中的<Context>元素的信息只適用於單個 Web 應用,
例如以下文件中的<Context>元素適用於名為“Catalina”的Engine下的localhost主機中的helloapp應用:
<CATALINA_HOME>/conf/Catalina/localhost/helloapp.xml
4)到Web應用的META-INF/context.xml文件中查找<Context>元素。這個文件中的<Context>元素的信息適用於當前Web應用。
5)到<CATALINA_HOME>/conf/server.xm文件中的<Host>元素中查找<Context>子元素。該<Context>元素的信息只適用於單個Web應用。
如果僅僅為單個 Web 應用配置<Context>元素,可以優先選擇第三種或第四種方式。第三種方式要求在Tomcat的相關目錄下增加一個包含<Context>元素的配置文件,而第四種方式則要求在 Web 應用的相關目錄下增加一個包含<Context>元素的配置文件。
對於這兩種方式,Tomcat在運行時都會監測包含<Context>元素的配置文件是否被更新,如果被更新,Tomcat 會自動重新加載並啟動 Web 應用,使對<Context>元素所做的修改生效。
c>采用第四種方式配置<Context>元素。
在 helloapp 目錄下新建一個META-INF子目錄,然后在其中創建一個context.xml文件,它的內容如下:
<Context path="/helloapp" docBase="helloapp" reloadable="true"/>
以上<Context>元素的 docBase 屬性表明,helloapp 應用的文件路徑為<CATALINA_HOME>/webapps/helloapp;path屬性表明訪問helloapp應用的URL入口為“/helloapp”。
d>采用第三種方式配置<Context>元素。
假定 helloapp 應用的文件路徑為C:\chapter03\helloapp,並且在<CATALINA_HOME>/webapps 目錄下沒有發布helloapp應用。
在<CATALINA_HOME>/conf目錄下先創建Catalina目錄,接着在Catalina目錄下再創建localhost目錄,然后在<CATALINA_HOME>/conf/Catalina/localhost目錄下創建helloapp.xml文件,它的內容如下:
<Context path="/helloapp" docBase="C:\ chapter03\helloapp" reloadable="true"/>
以上<Context>元素的 docBase 屬性指定了 helloapp 應用的絕對路徑,為C:\chapter03\helloapp;path屬性表明訪問helloapp應用的URL入口為“/helloapp”。
由於helloapp.xml文件位於Catalina/localhost/子目錄下,因此helloapp應用將運行在名為Catalina 的 Engine 組件的 localhost 虛擬主機中。訪問 helloapp應用中的 login.htm和hello.jsp的URL分別為:
http://localhost:8080/helloapp/login.htm http://localhost:8080/helloapp/hello.jsp
注意:如果沒有為Web應用配置Tomcat的Context元素,那么Tomcat會為Web應用提供一個默認的Context組件。conf/Catalina/localhost 空目錄
文件名:
ROOT.xml ,表示訪問時,無需加前綴;
當為 項目名.xml,訪問時,需要加前綴; 當為xxx.xml,訪問時需要添加xxx前綴。
e>采用第五種方式配置<Context>元素
在 server.xm文件中已經有一個名為 localhost 的<Host>元素,最常見的做法是在該<Host>元素中插入<Context>子元素,例如:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="/helloapp" docBase="helloapp" reloadable="true"/> </Host>