1. 程式人生 > >tomcat單機多例項

tomcat單機多例項

1、前言

  首先要回答一個問題,為什麼要用單機多例項?
在不宕機的情況下,webapps裡面存在多個專案,可能由於其中一個專案過度使用記憶體或者其他不確定的因素使得tomcat掛了,那麼同一tomcat下的專案也會一同掛了;而使用不同的tomcat,同一臺伺服器下,每個tomcat的程序是不一樣的額,一個專案出現問題tomcat掛了,那麼由於是在不同程序,其他專案不會影響的。
  還有一個問題就是不同tomcat使用了不同埠,最後域名只有一個怎麼分配?
其實這個使用nginx的反向代理,根據請求的字首,代理到相應的tomcat專案服務埠對應的nginx server即可。

2、系統環境

系統:16.04.5 LTS
JDK版本:openjdk 1.8
tomcat版本:apache-tomcat-9.0.13

3、環境搭建

3.1、下載tomcat

安裝jdk:

apt-get install openjdk-8-jdk
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-9/v9.0.13/bin/apache-tomcat-9.0.13.tar.gz

解壓tomcat:

tar -xzvf apache-tomcat-9.0.13.tar.gz

3.1製作多tomcat

改寫配置檔案:

cp /etc/profile /etc/profile.bak
echo "export CATALINA_HOME=/data/apache-tomcat-9.0.13" >> /etc/profile
echo "export PATH=\$PATH:\$CATALINA_HOME/bin">> /etc/profile && source /etc/profile

備份profile,並寫入tomcat的CATALINA_HOME到環境變數,啟用環境變數。

建立 tomcat-start.sh,內容如下:

#!/bin/bash
##這裡的CATALINA_BASE,是當前指令碼的的父目錄,如果不在CATALINA_BASE的子目錄的話,記得修改
export CATALINA_BASE=$(cd $(dirname $0); cd .. ; pwd)

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_ID) still running now , please shutdown it first";
    exit 2;
fi

TOMCAT_START_LOG=`$CATALINA_HOME/bin/startup.sh`

if [ "$?" = "0" ]; then
	echo "shell script: $0"
    echo "CATALINA_BASE: $CATALINA_BASE"
    echo "tomcat thread: $TOMCAT_ID"
    echo "start succeed!!!"
else
    echo "$0 $CATALINA_BASE start failed"
    echo $TOMCAT_START_LOG
fi

建立 tomcat-stop.sh,內容如下:

#!/bin/bash
##這裡的CATALINA_BASE,是當前指令碼的的父目錄,如果不在CATALINA_BASE的子目錄的話,記得修改
export CATALINA_BASE=$(cd $(dirname $0); cd .. ; pwd)

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 : $CATALINA_BASE"
    exit
fi

if [ "$?" = "0" ]; then
    echo "shell script: $0"
    echo "CATALINA_BASE: $CATALINA_BASE"
    echo "stop succeed!!!"
else
    echo "$0 $CATALINA_BASE stop failed"
    echo $TOMCAT_STOP_LOG
fi

改變許可權:

##建立一個程式目錄
mkdir /data
##更改許可權
chmod 760 /data/tomcat-start.sh /data/tomcat-stop.sh

複製兩個tomcat:

##移動解壓檔案到data目錄下
mv ./apache-tomcat-9.0.13 /data/

##完成刪除lib和bin資料夾內容,生成空的bin資料夾
cp -r apache-tomcat-9.0.13 /data/apache-tomcat-test1 && cd /data/apache-tomcat-test1  && rm -rf lib/ bin/ && mkdir bin  && cd -

##複製啟動和停止指令碼到bin資料夾,帶許可權複製
cp -p tomcat-start.sh tomcat-stop.sh /data/apache-tomcat-test1/bin/

##一個同樣的tomcat目錄,帶許可權複製
cp -Rp /data/apache-tomcat-test1/ /data/apache-tomcat-test2/

配置 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;

去掉註釋的版本:

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

tomcat-test1改為:

  • Server Port:9015
  • Connector Port:9010
  • AJP Port:9019

tomcat-test2改為:

  • Server Port:9025
  • Connector Port:9020
  • AJP Port:9029

修改標識:

echo "test1"> /data/apache-tomcat-test1/webapps/ROOT/index.jsp
echo "test2"> /data/apache-tomcat-test2/webapps/ROOT/index.jsp

修改完成,接著啟動tomcat:

/data/apache-tomcat-test1/bin/tomcat-start.sh
/data/apache-tomcat-test2/bin/tomcat-start.sh

在這裡插入圖片描述
curl的時候是比較慢的,因為還沒啟動完成。啟動完之後就好了。

4、後記

其實搭起來不太難,經過參考文章的思路,就是公用一個tomcat的lib和bin,這樣子升級的時候替換lib即可,bin都同一用CATALINA_HOME的指令碼,其實CATALINA_HOME下的bin下的start和shutdown指令碼統一呼叫了catalina.sh,而單機多例項的則是巧妙運用了catalina.sh是通過環境中的CATALINA_HOME和CATALINA_BASE變數啟動tomcat的,通過改變CATALINA_BASE的路徑達到同一條指令碼啟動tomcat在不同目錄下