単一マシン上での Tomcat の複数インスタンスの実装

単一マシン上での Tomcat の複数インスタンスの実装

1. はじめに

まず、1 台のマシンで複数のインスタンスを使用する理由という質問に答える必要があります。
ダウンタイムがない場合、Web アプリケーションには複数のプロジェクトがあります。プロジェクトの 1 つが過剰なメモリ使用量やその他の不確定な要因により Tomcat をクラッシュさせると、同じ Tomcat の下にあるプロジェクトもクラッシュします。ただし、異なる Tomcat を使用する場合、同じサーバー上の各 Tomcat プロセスは異なります。プロジェクトに問題が発生して Tomcat がクラッシュしても、他のプロジェクトは異なるプロセスにあるため影響を受けません。
もう 1 つの疑問は、異なる Tomcat が異なるポートを使用し、ドメイン名が 1 つしかないことです。どのように割り当てるのでしょうか。
実は、これは nginx のリバース プロキシを使用しています。リクエストのプレフィックスに応じて、対応する tomcat プロジェクト サービス ポートに対応する nginx サーバーにプロキシできます。

2. システム環境

システム: 16.04.5 LTS
JDK バージョン: openjdk 1.8
tomcat バージョン: apache-tomcat-9.0.13

3. 環境構築

3.1、Tomcatをダウンロード

jdk をインストールします:

apt-get で openjdk-8-jdk をインストールします

公式サイトにアクセスしてください: https://tomcat.apache.org/download-90.cgi


コアを見つけて、tar.gz をクリックし、ダウンロード リンクがポップアップ表示されたらダウンロード アドレスをコピーします。
次に、コマンドを使用してTomcatをダウンロードします。

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

プログラム ディレクトリを作成します。

##プログラムディレクトリを作成する mkdir /data

##解凍したファイルをデータディレクトリに移動します mv ./apache-tomcat-9.0.13 /data/

cp /etc/profile /etc/profile.bak
echo "CATALINA_HOME=/data/apache-tomcat-9.0.13" をエクスポート >> /etc/profile
echo "export PATH=\$PATH:\$CATALINA_HOME/bin">> /etc/profile && source /etc/profile
##sh ファイルを作成します touch tomcat-start.sh tomcat-stop.sh

##権限を変更する chmod 760 /data/tomcat-start.sh /data/tomcat-stop.sh

プロファイルをバックアップし、Tomcat の CATALINA_HOME を環境変数に書き込み、環境変数を有効にします。

作成するtomcat-start.sh の内容は次のとおりです。

#!/bin/bash
##CATALINA_BASE は、現在のスクリプトの親ディレクトリです。CATALINA_BASE のサブディレクトリにない場合は、export CATALINA_BASE=$(cd $(dirname $0); cd .. ; pwd) を変更することを忘れないでください。

$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) はまだ実行中です。まずシャットダウンしてください";
 出口2;
フィ

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

[ "$?" = "0" ]の場合;
	echo "シェルスクリプト: $0"
 「CATALINA_BASE: $CATALINA_BASE」をエコーし​​ます
 echo "Tomcat スレッド: $TOMCAT_ID"
 echo "開始成功!!!"
それ以外
 echo "$0 $CATALINA_BASE の起動に失敗しました"
 $TOMCAT_START_LOG をエコーし​​ます
フィ

作成するtomcat-stop.sh の内容は次のとおりです。

#!/bin/bash
##CATALINA_BASE は、現在のスクリプトの親ディレクトリです。CATALINA_BASE のサブディレクトリにない場合は、export CATALINA_BASE=$(cd $(dirname $0); cd .. ; pwd) を変更することを忘れないでください。

$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`
それ以外
 echo "Tomcat インスタンスが見つかりません: $CATALINA_BASE"
 出口
フィ

[ "$?" = "0" ]の場合;
 echo "シェルスクリプト: $0"
 「CATALINA_BASE: $CATALINA_BASE」をエコーし​​ます
 echo "停止成功!!!"
それ以外
 echo "$0 $CATALINA_BASE の停止に失敗しました"
 $TOMCAT_STOP_LOG をエコーし​​ます
フィ

2 つの Tomcat をコピーします。

##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 の最初の 3 つのポートのみを変更する必要があります。しかし、次の 4 つがあります。

  • サーバー ポート: このポートは、Tomcat をシャットダウンするためのシャットダウン コマンドをリッスンするために使用されます。デフォルト値は 8005 です。
  • コネクタ HTTP ポート: このポートは、HTTP 要求をリッスンするために使用されます。デフォルト値は 8080 です。
  • コネクタ AJP ポート: このポートは、AJP (Apache JServ プロトコル) プロトコルの要求をリッスンするために使用されます。通常、Apache サーバーなどの他の HTTP サーバーを統合するために使用されます。デフォルトのポートは 8009 です。
  • リダイレクト ポート: リダイレクト ポートは、コネクタ構成に表示されます。コネクタが非 SSL の通常の http 要求のみをサポートしている場合、ポートは https 要求をリダイレクト ポートで指定されたポートに転送します。デフォルトは 8443 です。

コメントなしバージョン:

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<サーバーポート="8005" シャットダウン="シャットダウン">
 <リスナークラス名="org.apache.catalina.startup.VersionLoggerListener" />
 <リスナークラス名="org.apache.catalina.core.AprLifecycleListener" SSLEngine="オン" />
 <リスナークラス名="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
 <リスナークラス名="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
 <リスナークラス名="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 <グローバル命名リソース>
 <リソース名="UserDatabase" auth="コンテナ"
    タイプ="org.apache.catalina.UserDatabase"
    description="更新および保存できるユーザーデータベース"
    ファクトリー="org.apache.catalina.users.MemoryUserDatabaseFactory"
    パス名="conf/tomcat-users.xml" />
 </グローバル命名リソース>
 <サービス名="Catalina">
 <コネクタ ポート="8080" プロトコル="HTTP/1.1"
    接続タイムアウト = "20000"
    リダイレクトポート="8443" />
 <コネクタ ポート="8009" プロトコル="AJP/1.3" リダイレクト ポート="8443" />
 <エンジン名="Catalina" defaultHost="localhost">
  <レルムクラス名="org.apache.catalina.realm.LockOutRealm">
  <レルムクラス名="org.apache.catalina.realm.UserDatabaseRealm"
    リソース名="ユーザーデータベース"/>
  </レルム>
  <ホスト名="localhost" appBase="webapps"
   unpackWARs="true" autoDeploy="true">
  <Valve クラス名="org.apache.catalina.valves.AccessLogValve" ディレクトリ="logs"
    プレフィックス="localhost_access_log" サフィックス=".txt"
    パターン="%h %l %u %t &quot;%r&quot; %s %b" />
  </ホスト>
 </エンジン>
 </サービス>
</サーバー>

tomcat-test1 は次のように変更されます:

  • サーバーポート: 9015
  • コネクタ HTTP ポート: 9010
  • コネクタ AJP ポート: 9019

tomcat-test2 は次のように変更されます:

  • サーバーポート: 9025
  • コネクタ HTTP ポート: 9020
  • コネクタ AJP ポート: 9029

ロゴを変更します:

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

変更が完了したら、Tomcat を起動します。

Apache Tomcat テスト 1 の bin/Tomcat 開始.sh
Apache Tomcat テスト 2 の bin/Tomcat 開始.sh


カール処理はまだ完了していないため、比較的遅くなります。起動したら大丈夫です。

カール 127.0.0.1:9010
カール 127.0.0.1:9020

ここでのアクセスポートはConnector HTTP Portに対応するポートであることに注意してください。

4. 追記

実は、設定は難しくありません。参考記事のアイデアによると、Tomcat の lib と bin を共有することです。このようにすると、アップグレード時に lib を交換するだけで済み、bin は CATALINA_HOME の同じスクリプトを使用します。実際、CATALINA_HOME の下の bin の下の起動スクリプトとシャットダウン スクリプトは、一様に catalina.sh を呼び出し、単一マシンのマルチインスタンス システムは巧妙運用了catalina.sh是通過環境中的CATALINA_HOME和CATALINA_BASE變量啟動tomcat的。CATALINA_BASE改變CATALINA_BASE的路徑達到同一條腳本啟動tomcat在不同目錄下

5. 質問

5.1. Tomcat の起動が遅い

セッション ID の生成に 1 分 6 秒かかり、長すぎるため、アプリケーションの展開にかかる全体的な時間が大幅に増加していることがわかります。この問題は、アプリケーションの起動時に jvm パラメータ-Djava.security.egd=file:/dev/./urandomを追加することで解決できます。ただし、これによりアプリケーションの乱数生成能力が弱まるか、ランダム性が十分に均一でなくなるため、暗号化を頻繁に使用するアプリケーションではセキュリティに影響が出る可能性があります。
起動スクリプトを変更し、JAVA_OPTS 設定を追加します。catalina.sh はこの変数を読み取るため、JAVA_OPTS を使用できます。

#!/bin/bash
##CATALINA_BASE は、現在のスクリプトの親ディレクトリです。CATALINA_BASE のサブディレクトリにない場合は、export CATALINA_BASE=$(cd $(dirname $0); cd .. ; pwd) を変更することを忘れないでください。
$CATALINA_BASE をエコーする

TOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'`

エクスポート JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom";

if [ -n "$TOMCAT_ID" ] ; then
echo "tomcat($TOMCAT_ID) はまだ実行中です。まずシャットダウンしてください";
 出口2;
フィ

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

[ "$?" = "0" ]の場合;
  echo "シェルスクリプト: $0"
 「CATALINA_BASE: $CATALINA_BASE」をエコーし​​ます
 echo "Tomcat スレッド: $TOMCAT_ID"
 echo "開始成功!!!"
それ以外
 echo "$0 $CATALINA_BASE の起動に失敗しました"
 $TOMCAT_START_LOG をエコーし​​ます
フィ

5.2. リモートsshを使用する場合、環境変数は有効になりません

現在の環境変数を更新するには、source コマンドを使用します。

具体的な変更点は以下のとおりです。

tomcat-start.sh :

#!/bin/bash
##CATALINA_BASEは現在のスクリプトの親ディレクトリです。CATALINA_BASEのサブディレクトリにない場合は、ソースの/etc/profileを変更することを忘れないでください。
エクスポート CATALINA_BASE=$(cd $(dirname $0); cd .. ; pwd)
エクスポート JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom";
TOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'`

エコー "----------------------------------"
echo "CATALINA_BASE:$CATALINA_BASE を使用しています"
echo "CATALINA_HOME:$CATALINA_HOME を使用しています"
エコー "----------------------------------"

if [ -n "$TOMCAT_ID" ] ; then
echo "tomcat($TOMCAT_ID) はまだ実行中です。まずシャットダウンしてください";
 出口2;
フィ

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

[ "$?" = "0" ]の場合;
	echo "シェルスクリプト: $0"
 echo "Tomcat スレッド: $TOMCAT_ID"
 echo "開始成功!!!"
それ以外
 echo "$0 $CATALINA_BASE の起動に失敗しました"
	「CATALINA_BASE: $CATALINA_BASE」をエコーし​​ます
 $TOMCAT_START_LOG をエコーし​​ます
フィ

tomcat-stop.sh

#!/bin/bash
## CATALINA_BASEは現在のスクリプトの親ディレクトリです。CATALINA_BASEのサブディレクトリにない場合は、ソースの/etc/profileを変更することを忘れないでください。
エクスポート CATALINA_BASE=$(cd $(dirname $0); cd .. ; pwd)
TOMCAT_ID=`ps aux |grep "java"|grep "[D]catalina.base=$CATALINA_BASE "|awk '{ print $2}'`

エコー "----------------------------------"
echo "CATALINA_BASE:$CATALINA_BASE を使用しています"
echo "CATALINA_HOME:$CATALINA_HOME を使用しています"
エコー "----------------------------------"

if [ -n "$TOMCAT_ID" ] ; then
TOMCAT_STOP_LOG=`$CATALINA_HOME/bin/shutdown.sh`
それ以外
 echo "Tomcat インスタンスが見つかりません: $CATALINA_BASE"
 出口
フィ

[ "$?" = "0" ]の場合;
 echo "シェルスクリプト: $0"
 echo "停止成功!!!"
それ以外
 echo "$0 $CATALINA_BASE の停止に失敗しました"
	「CATALINA_BASE: $CATALINA_BASE」をエコーし​​ます
 $TOMCAT_STOP_LOG をエコーし​​ます
フィ

再起動スクリプトを添付します:
tomcat-restart.sh :

#!/bin/bash

ソース /etc/profile
エクスポート CATALINA_BASE=$(cd $(dirname $0); cd .. ; pwd)
GREEN_COLOR='\E[1;32m' # 緑 RES='\E[0m'

TOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'`

スリープ時間=1

エコー "----------------------------------"
echo "CATALINA_BASE:$CATALINA_BASE を使用しています"
echo "CATALINA_HOME:$CATALINA_HOME を使用しています"
エコー "----------------------------------"

if [ -n "$TOMCAT_ID" ] ; then
 echo -e "${GREEN_COLOR}pid $TOMCAT_ID で tomcat インスタンスが見つかりました。今すぐシャットダウンしてください!${RES}";
 echo -e "${GREEN_COLOR}---------------start shut down-------------------${RES}"
 ソース $(dirname $0)/tomcat-stop.sh;
 echo -e "${GREEN_COLOR}--------------- シャットダウン終了 -------------------${RES}"
フィ

[ -n "$TOMCAT_ID" ] の間
する 
 スリープ $SLEEP_TIME
 echo wait "$SLEEP_TIME" s
 TOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'`
終わり 

echo -e "${GREEN_COLOR}---------------スタートアップを開始-------------------${RES}"
ソース $(dirname $0)/tomcat-start.sh
echo -e "${GREEN_COLOR}---------------スタートアップ終了-------------------${RES}"

参考ブログ:

Tomcatの単一マシン複数インスタンスについてお話しましょう

Spring Boot アプリケーションの初回起動が遅い

単一マシン上での Tomcat の複数インスタンスの実装に関するこの記事はこれで終わりです。単一マシン上での Tomcat の複数インスタンスに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linux で単一の Tomcat の複数のインスタンスを展開するためのシェル スクリプトの詳細な説明
  • IDEA 2020.3.1 で Tomcat をデプロイし、最初の Web プロジェクトを作成するプロセスの詳細な説明
  • Tomcat を使用して IntelliJ IDEA によってデプロイされたプロジェクトの場所はどこですか?
  • Tomcat マルチインスタンスの展開と構成の原則

<<:  画像のフェードインとフェードアウト効果を実現する js

>>:  MySQL が大規模トランザクションを避けるべき理由とその解決方法

推薦する

MySQL8 ベースの docker-compose デプロイメント プロジェクトの実装

1. まず、次のパスに従って対応するフォルダを作成します。 ローカルのdockerでmysqlを実行...

MySQL Workbenchのダウンロードと使用方法のチュートリアルの詳細な説明

1. MySQL WorkbenchをダウンロードするWorkbench は、MySQL のグラフィ...

mysql ルートユーザーを認証できず、Navicat リモート認証プロンプト 1044 の問題を解決します

まず解決策を見てみましょう #------------mysql の root ユーザーに権限を付与...

React における useEffect と useLayoutEffect の違い

目次前提条件使用効果コミット前ミューテーション効果コミットミューテーション効果コミットレイアウト効果...

Linux に setup.py プログラムをインストールする方法

まず次のコマンドを実行します: [root@mini61 setuptools-8.2.1]# py...

ウェブサイト構築経験概要

<br />注目を集めるウェブサイトを作成するには、どのような原則に従うべきでしょうか?...

Linux CentOS 7.7 システムの VMware インストールに関する詳細なチュートリアル

Linux CentOS 7.7 システムを Vmware にインストールする方法。最小限のインスト...

コンパイル/サーバーなしでブラウザにCommonJSモジュールを実装する

目次導入1. one-click.jsとは2. パッケージングツールはどのように機能しますか? 3....

Js でオブジェクトのディープ オブジェクトを安全に取得するメソッドの例

目次序文文章パラメータ例Lodash 実装:トーキー機能: castPath関数: stringTo...

Vueモバイル端末は左スライド編集と削除の全プロセスを実現します

序文プロジェクトのニーズに応じて、Vue-touch を使用して、vue モバイル端末の左スワイプ編...

MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析

前書き: MySQL でテーブルを設計する場合、MySQL では UUID や非連続かつ非繰り返しの...

Centos に MYSQL8.X をインストールするチュートリアル

MySQLのインストール(4、5、6は省略可能)ステートメント: CentOS のバージョンは 7....

nginx での書き換えジャンプの実装

1. 新旧ドメイン名のジャンプ適用シナリオ: ドメイン名ベースのリダイレクト。会社の古いドメイン名は...

MySQL 自動インクリメント ID 枯渇の例

ディスプレイ定義IDテーブルに定義された自動増分IDが上限に達した場合、次のIDを申請する際に得られ...

HTMLを教える記事

アーティストになるつもりがない場合は、開発者として HTML を読んで、必要に応じて簡単な変更を加え...