天天看點

聊聊 Tomcat 的單機多執行個體

Tomcat 從何而來?

先說 Tomcat 這一單詞解釋,如果你不是一個開發者,當然它在美國口語中并非是褒義詞;如果你是開發者,那你一定聽過 Web 應用伺服器、Sun 公司和 Tomcat 。如你所知道那樣,牛逼的公司總是推動這個世界的發展,并建立一個又一個标準,當然,在軟體界 Sun 公司絕對算牛逼中的其一。

在貴的離譜的商用伺服器充斥着市場的時候,Sun 公司推出了第一個 Java servlet container(Servlet 容器) 名字叫:Java Web Server(JWS),物美價廉,這簡直是業界的一股清流,但市場并沒有像他們想象的那麼喜歡 JWS,一家商業公司如果産品賣不出去,那真是令人極其傷感的,但對于 Sun 公司來說這不重要,因為他們是 Java servlet 這個最初的标準的制定者,應該沒有什麼比這個更令人興奮的了。随着标準的推出,直接推動了當時許多自由的、免費的 Java servlet container 的出現,像 Jetty 、JServ 等這些容器,好像所有人都喜歡免費,當然同時期還有一些商用的如 WebLogic 、JRun 這些容器存在。到這裡好像還并沒有出現 Tomcat ,别着急,Sun 公司其實比你更着急,因為 JSP 還沒有出現。

可能由于 Sun 公司在 Servlet 容器市場的低迷表現,他們轉頭又憤而推出了迷你型 servlet coutainer 并支援 Web 的工具包,他們稱之為 JavaServer Pages(JSP),這個工具包(JSDK)任何人都可以下載下傳,接着随着 Sun 接着制定了新版的 JSP 規範,JSDK 也更新到了 2.1 版本後,注意,這時候大神出現了。在 Sun 公司上班的 James Duncan Davidson 沒有使用任何原來代碼的情況下寫出了一個全新的 servlet contaniner ,從此取代了 JSDK 2.1 版本,因次這也是為什麼 Tomcat 的版本是從 3.0 開始的而不是 1.0 。

當然,接下來的加入 Apache 基金會和開源也算是 Sun 公司為軟體界的貢獻,這其中肯定有商業上的考慮,但你何必在意呢。

Tomcat 的基本組成

了解一個事物的本質是現在就用它。不廢話,直接先說一下 Tomcat 的安裝和使用,之前寫過 Tomcat 在 CentOS 、Windows 和配合 Nginx 在做負載均衡這三篇文章,用到的可以簡單看下:

  • CentOS 下安裝 Tomcat
  • Windows 下安裝 Tomcat
  • CentOS 下 Nginx + Tomcat 配置負載均衡

安裝好之後,進入安裝目錄看一眼結構:

聊聊 Tomcat 的單機多執行個體

簡單介紹一下各個檔案夾及檔案:

  • bin:主要存放腳本檔案,例如比較常用的windows和linux系統中啟動和關閉腳本
  • conf:主要存放配置檔案,其中最重要的兩個配置檔案是server.xml和web.xml
  • lib:主要存放tomcat運作所依賴的包
  • LICENSE:版權許可證,軟體版權資訊及使用範圍等資訊
  • logs:主要存放運作時産生的日志檔案,例如catalina.out(曾經掉過一個大坑)、catalina.{date}.log等
  • NOTICE:通知資訊,一些軟體的所屬資訊和位址什麼的
  • RELEASE-NOTES:釋出說明,包含一些版本更新功能點
  • RUNNING.txt:運作說明,必需的運作環境等資訊
  • temp:存放tomcat運作時産生的臨時檔案,例如開啟了hibernate緩存的應用程式,會在該目錄下生成一些檔案
  • webapps:部署web應用程式的預設目錄,也就是 war 包所在預設目錄
  • work:主要存放由JSP檔案生成的servlet(java檔案以及最終編譯生成的class檔案)

上面是一個安裝後的 Tomcat 的全部組成部分,如果你要啟動,進入

bin

目錄執行

startup.sh

就可以了,接着就可以在浏覽器輸入

http://localhost:8080/

通路了。那麼問題來了:當你有了三個、五個以及十個應用服務需要同時部署到同一台伺服器上時,你的 Tomcat 服務正确啟動方式是什麼?是把上面檔案全部複制出 N 多個目錄麼?還是有其他處理方式呢?

Tomcat 常見的幾種部署場景

通常,我們在同一台伺服器上對 Tomcat 部署需求可以分為以下幾種:單執行個體單應用,單執行個體多應用,多執行個體單應用,多執行個體多應用。執行個體的概念可以了解為上面說的一個 Tomcat 目錄。

  • 單執行個體單應用:比較常用的一種方式,隻需要把你打好的 war 包丢在

    webapps

    目錄下,執行啟動 Tomcat 的腳本就行了。
  • 單執行個體多應用:有兩個不同的 Web 項目 war 包,還是隻需要丢在

    webapps

    目錄下,執行啟動 Tomcat 的腳本,通路不同項目加上不同的虛拟目錄。這種方式要慎用在生産環境,因為重新開機或挂掉 Tomcat 後會影響另外一個應用的通路。
  • 多執行個體單應用:多個 Tomcat 部署同一個項目,端口号不同,可以利用 Nginx 這麼做負載均衡,當然意義不大。
  • 多執行個體多應用:多個 Tomcat 部署多個不同的項目。這種模式在伺服器資源有限,或者對伺服器要求并不是很高的情況下,可以實作多個不同項目部署在同一台伺服器上的需求,來實作資源使用的最大化。-

這次其實要說的就是這種方式,但多個 Tomcat 就是簡單的複制出一個新的 Tomcat 目錄後改一下端口麼?這樣做也太 Low 了點吧?哈哈,其實并不是低端沒技術含量的問題,當你同一台伺服器部署了多個不同基于 Tomcat 的 Web 服務時,會迎來下面幾個極其現實的問題。

  • 當你需要對數十台 Tomcat 版本進行更新的時候,你需要怎麼做?
  • 當你需要針對每一個不同的 Web 服務配置設定不用的記憶體時,你需要怎麼做?
  • 當你需要啟動多台伺服器時,你需要怎麼做?

當然,好像上面的都不是很重要,注意,劃重點,多執行個體部署最大作用就是最大化利用伺服器資源。

說幹就幹,現在就開始幹?

别着急别着急,先看一下官方文檔怎麼建議的。他們說可不建議你複制一個又一份的全部 Tomcat 目錄進行多執行個體的部署,說安照下圖可以實作更優雅的 Tomcat 單機多執行個體部署:

聊聊 Tomcat 的單機多執行個體

上圖中的

CATALINA_HOME

指Tomcat安裝路徑,

CATALINA_BASE

指執行個體所在位置。

CATALINA_HOME

路徑下隻需要包含

bin

lib

目錄,而

CATALINA_BASE

隻存放

conf、webapps、logs

等這些檔案,這樣部署的好處在于更新友善,配置及安裝檔案間互不影響,在不影響 Tomcat 執行個體的前提下,替換掉

CATALINA_HOME

中的安裝檔案。

流程清楚了,接下來才是真正的撸起袖子加油幹了。

快來實踐一下吧

你看到了這裡肯定已經安裝了 Tomcat 了,我現在示範用的是最新的 8.5.11 版本。

1.複制出兩個 Tomcat 執行個體

在 Tomcat 安裝路徑的同一級目錄下,建立兩個

tomcat-1、tomcat-2

檔案夾,先把安裝路徑下的

conf、webapps、temp、logs、work

這五個檔案移動到

tomcat-1

執行個體中:

聊聊 Tomcat 的單機多執行個體

指令:

mkdir tomcat-1 tomcat-2
cd apache-tomcat-8.5.11
mv conf/ webapps/ temp/ logs/ work/ -t ../tomcat-1
           

接着把

tomcat-1

下的這幾個檔案再複制到

tomcat-2

中,直接指令:

cp tomcat-1/* tomcat-2
           

2.建立 Tomcat 啟動、停止腳本

依然是在 Tomcat 安裝路徑的同一級目錄下,建立兩個

tomcat-shell

檔案夾,用于存放啟動和停止腳本,同時賦予檔案全部權限。

聊聊 Tomcat 的單機多執行個體

指令:

cd tomcat-shell/
vim start_tomcat.sh
vim stop_tomcat.sh
chmod 777 start_tomcat.sh stop_tomcat.sh
           

tomcat-start.sh:

聊聊 Tomcat 的單機多執行個體
#!/bin/bash

export CATALINA_HOME=/software/apache-tomcat-8.5.11
export CATALINA_BASE=${1%/}

echo $CATALINA_BASE

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}) still running now , please shutdown it firest";
    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
           

tomcat-stop.sh:

聊聊 Tomcat 的單機多執行個體
#!/bin/bash

export CATALINA_HOME=/software/apache-tomcat-8.5.11
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
           

這兩個就是簡單的腳本,其中傳入了要啟動的 Tomcat 執行個體所在的路徑,當然,你也可以寫一個重新開機的腳本,其實就是先停止再啟動,還可以加入不同的 JVM 參數配置等等操作。

到這裡,其實全部基礎工作已經做好了。接下來我們看一眼整個多執行個體的目錄結構:

聊聊 Tomcat 的單機多執行個體

3.配置 server.xml 端口

你知道的,同一個伺服器部署不同 Tomcat 要設定不同的端口,不然會報端口沖突,是以我們隻需要修改

conf/server.xml

中的其中前三個端口就行了。但它有四個分别是:

  • Server Port:該端口用于監聽關閉tomcat的shutdown指令,預設為8005
  • Connector Port:該端口用于監聽HTTP的請求,預設為8080
  • AJP Port:該端口用于監聽AJP( Apache JServ Protocol )協定上的請求,通常用于整合Apache Server等其他HTTP伺服器,預設為8009
  • Redirect Port:重定向端口,出現在Connector配置中,如果該Connector僅支援非SSL的普通http請求,那麼該端口會把 https 的請求轉發到這個Redirect Port指定的端口,預設為8443;

我這裡把

tomcat-2

執行個體的

Connector Port

改為了 8081 ,并分别在

tomcat-1、tomcat-2

webapps/ROOT

目錄下放入了一個頁面檔案,内容如下:

<html>
<title>Tomcat-1</title>
<body>
    Hello Mafly! from Tomcat-1.
</body>
</html>
           

4.啟動

直接通過執行我們剛寫的腳本,傳入某一個 Tomcat 執行個體路徑即可來啟動對應的 Tomcat。

聊聊 Tomcat 的單機多執行個體

指令:

/software/tomcat-shell/start_tomcat.sh /software/tomcat-1
/software/tomcat-shell/start_tomcat.sh /software/tomcat-2
           

去浏覽器看一眼:

聊聊 Tomcat 的單機多執行個體

哈哈,可以了。接下來,停止或者重新開機什麼的都一樣,你可以根據需要來在單個伺服器上建立更多的 Tomcat 執行個體,一切都看你喜歡。

總結一下

這兩天簡單翻了一下 《Tomcat 權威指南》這本書,對于我們日常使用的 Tomcat 有了更詳細的了解,當然我在這裡并沒有詳細寫配置、部署管理工具、安全管理和叢集什麼的,我還了解不夠透徹,隻是簡單把 Tomcat 單機多執行個體比較優雅的部署方式玩了一下,希望對你有用。

昨天晚上看 Linux 和 Git 的發起者 Linus 這位大神的傳記,真是令人感到上帝的不公平,怎麼能設計出這樣的天才人類,但更令人興奮的是,我們目前絕大多數人都被設計成了幾乎無差别,還遠遠輪不到拼智商的地步。

繼續閱讀