77Lifeworkベータ版

77Lifeworkベータ版

IT関係の話(ツール開発・インフラ構築)をメインとして、その他私の趣味や雑記用のブログです。ここに書いた内容が少しでも参考になれば嬉しいです。

Tomcatを複数起動(複数インスタンスを構成)する

(2020/5/4更新)

はじめに

今回はLinux(CentOS)上にTomcatを複数インストールし、それぞれ独立したインスタンスとして起動する方法を書いていきます。
ここではTomcatを2つ起動し、それに合わせてApacheも2つ起動した上でTomcatへのアクセスはApacheを介するよう設定するので、1つのサーバにApacheおよびTomcatインスタンスが2つずつ起動している状態とします。

アクセスする時のイメージは下図です。
f:id:J-back:20200320175724j:plain:w600

80番ポートでアクセスした場合は1つ目のApacheインスタンスを経由して1つ目のTomcatインスタンスが応答、8080番ポートへアクセスした場合は2つ目のApacheインスタンスを経由して2つ目のTomcatインスタンスが応答、といった感じです。

この記事では最終的にApacheTomcatへの連携をするために、Apacheインスタンスが2つ起動していることを前提としていますが、連携が必要ないならばTomcatのみのインストールでも大丈夫です。

Apacheインスタンスを2つ起動する方法については、以下の記事を参考にしてください。
www.77-lifework.com

構成情報

CentOS 7.7(1908)
Apache 2.4.43
・Open JDK 11.0.7
Tomcat 9.0.34
・ポート番号
 インスタンス1:80
 インスタンス2:8080

Open JDKのインストール

Tomcatを動作させるため、まずはJavaの動作環境としてOpen JDKをインストールしましょう。
以下コマンドを実行します。

yum -y install java-11-openjdk
yum -y install java-11-openjdk-devel

上記を実行後、以下のコマンドでインストールされていることを確認しましょう。

java -version

f:id:J-back:20200503154546p:plain:w600


また、Java環境変数も設定しておきましょう。
「/etc/profile」をテキストエディタで開き、以下を追記します。

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk

追記後、以下を実行して環境変数を反映、確認しておきましょう。

source /etc/profile
echo $JAVA_HOME

Tomcatのインストール

次にTomcatをインストールしていきます。
以下のページを開き、tar.gz形式を選択してダウンロードします。
基本的にその時点での最新バージョンで良いと思います。
以下、「tomcat-x.x.x」はインストールするバージョンに合わせて読み替えてください。
tomcat.apache.org

f:id:J-back:20200503155041p:plain:w600

ダウンロードしたファイルをscp等でLinuxマシン上の「/tmp」に配置します。
(Linuxマシンで直接tomcatのページにアクセスしてダウンロードしても大丈夫です)

以下コマンドで解凍し、「tomcat-9.0.34」というディレクトリ名で「/opt」以下に配置しましょう。

cd /tmp
tar -zxvf apache-tomcat-9.0.34.tar.gz
cp -R apache-tomcat-9.0.34 /opt/tomcat-9.0.34

また、2つ目のインスタンス用として、解凍したディレクトリをもう1つ別名で配置します。

cp -R apache-tomcat-9.0.34 /opt/tomcat-9.0.34-ex

これで「/opt」に2つのTomcatディレクトリが存在する状態となりました。
f:id:J-back:20200503160345p:plain:w600


ここから、Tomcatが使用するポート番号を変更していきます。
まずは1つ目のインスタンスについて、「/opt/tomcat-9.0.34/conf/server.xml」をエディタで開き、以下のように、8005、8080番ポートが記載されている箇所を探します。
f:id:J-back:20200503161507p:plain:w600
f:id:J-back:20200503161613p:plain:w600

これらをそれぞれ18005、8081番ポートへ変更します。
とくに、8080番ポートについては今回構築している環境の2つ目のApacheインスタンスで使用しているため、変更の必要があります。

指定するポート番号(18005、8081)については、他のプロセスと重複していないことをあらかじめ確認しておきましょう。
以下のコマンドで指定したポート番号が他のプロセスで使用されているか確認することができます。

lsof -i:ポート番号

f:id:J-back:20200503161849p:plain:w600


また、TCPUDPで使用されているポートは以下のコマンドでも確認できます。

ss -anut

f:id:J-back:20200503162010p:plain:w600

18005、8081番ポートが他プロセスで使用されていないことを確認できたら、server.xmlを編集します。
8005→18005、8080→8081と変更します。
f:id:J-back:20200503162225p:plain:w600
f:id:J-back:20200503162244p:plain:w600


ここまで設定できたらTomcatの起動設定をしていきます。
まずは以下を実行して、Tomcat用のユーザを作成し、Tomcatインストールディレクトリの権限を変更しておきます。

useradd -s /sbin/nologin tomcat
chown -R tomcat:tomcat /opt/tomcat-9.0.34

次に、Tomcatをサービスとして登録し、systemctlコマンドから起動・停止などといった制御をできるようにします。
「/etc/systemd/system」に「tomcat9.service」というファイルを作成し、中身を以下のように記述しましょう。

[Unit]
Description=Apache Tomcat 9
After=syslog.target network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/tomcat-9.0.34/tomcat9.pid
RemainAfterExit=yes

ExecStart=/opt/tomcat-9.0.34/bin/startup.sh
ExecStop=/opt/tomcat-9.0.34/bin/shutdown.sh
ExecReStart=/opt/tomcat-9.0.34/bin/shutdown.sh;/opt/tomcat-9.0.34/bin/startup.sh

[Install]
WantedBy=multi-user.target

上記を保存した後、以下コマンドでTomcatを起動します。

systemctl start tomcat9

起動後、以下コマンドで状態を確認します。

systemctl status tomcat9

f:id:J-back:20200503162730p:plain:w600


ブラウザから8081番ポートにアクセスすると、以下のようにTomcatの初期画面が表示されます。
f:id:J-back:20200503162825p:plain:w600

これで1つ目のTomcatインスタンスのインストールが完了しました。


次に、2つ目のインスタンス設定を実施します。
基本的に流れは同じですが、使用するポート番号を他と重複しないように28005、8082と設定します。
「/opt/tomcat-9.0.34-ex/conf/server.xml」をエディタで開き、8005→28005、8080→8082と変更します。
f:id:J-back:20200503163401p:plain:w600
f:id:J-back:20200503163419p:plain:w600


上記が設定できたら、2つ目のインスタンスについても起動設定をしていきます。
プログラムディレクトリの権限を変更します。

chown -R tomcat:tomcat /opt/tomcat-9.0.34-ex

次に、2つ目のインスタンスをサービスとして登録します。
「/etc/systemd/system」に「tomcat9-ex.service」というファイルを作成し、中身を以下のように記述しましょう。

[Unit]
Description=Apache Tomcat 9 ex
After=syslog.target network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/tomcat-9.0.34-ex/tomcat9-ex.pid
RemainAfterExit=yes

ExecStart=/opt/tomcat-9.0.34-ex/bin/startup.sh
ExecStop=/opt/tomcat-9.0.34-ex/bin/shutdown.sh
ExecReStart=/opt/tomcat-9.0.34-ex/bin/shutdown.sh;/opt/tomcat-9.0.34-ex/bin/startup.sh

[Install]
WantedBy=multi-user.target


上記を保存し、以下コマンドで2つ目のTomcatを起動します。

systemctl start tomcat9-ex

f:id:J-back:20200503163835p:plain:w600


ブラウザから8082番ポートにアクセスすると、2つ目のTomcatインスタンスが応答した画面が表示されます。
f:id:J-back:20200503163932p:plain:w600

ここまでの設定によって、
・80番ポートへアクセス→1つ目のApacheインスタンスが応答
・8080番ポートへアクセス→2つ目のApacheインスタンスが応答
・8081番ポートへアクセス→1つ目のTomcatインスタンスが応答
・8082番ポートへアクセス→2つ目のTomcatインスタンスが応答
という状態になりました。

ApacheからTomcatへの通信転送設定

以下の記事を参考に設定していきます。
www.77-lifework.com

今回はApacheTomcatインスタンスを2つずつ起動しているので、それぞれに対して転送設定をします。

1つ目のインスタンスについて(80番ポートを使用)

Apacheの1つ目のインスタンスのインストールディレクトリを「/opt/httpd-2.4.43」とします。
まずは「/opt/httpd-2.4.43/conf/extra」ディレクトリの「httpd-proxy.conf」ファイルを編集し、Apacheの80番ポートで受けた通信を18009番ポートで転送するように設定します。
(これらのディレクトリやファイルが存在しない場合は新規に作成してください)

ProxyPass / ajp://localhost:18009/

f:id:J-back:20200504153843p:plain:w600

このファイルをApacheに読み込ませるために、「/opt/httpd-2.4.43/conf」ディレクトリの「httpd.conf」を開き、以下を追記します。

Include conf/extra/httpd-proxy.conf

f:id:J-back:20200504154300p:plain:w600


次に、Tomcatの設定をしていきます。
インストールディレクトリを「/opt/tomcat-9.0.34」とした場合に、「/opt/tomcat-9.0.34/conf」ディレクトリの「server.xml」を編集します。
ajpのConnector設定の記載箇所について、8009番ポートを18009番ポートへ変更しましょう。
このとき、「secretRequired="false"」の記載がなければ記載しておきます。
f:id:J-back:20200504155017p:plain:w600

ここまで設定できたら一度ApacheTomcatを再起動しておきましょう。
再起動後、ブラウザから80番ポートにアクセスすると、以下のように通信がApacheから転送されてTomcatの画面が表示されています。
f:id:J-back:20200504155401p:plain:w600

2つ目のインスタンスについて(8080番ポートを使用)

次に、2つ目のインスタンスの設定です。基本的に1つ目のインスタンスと同様ですが、ポート番号が重複しないよう設定します。
Apacheのインストールディレクトリを「/opt/httpd-2.4.43-ex」とした場合、「/opt/httpd-2.4.43-ex/conf/extra」ディレクトリの「httpd-proxy.conf」に以下を追記します。2つ目のインスタンスajpは28009番ポートを使用するよう設定します。

ProxyPass / ajp://localhost:28009/

また、「/opt/httpd-2.4.43-ex/conf」ディレクトリの「httpd.conf」に以下を記載します。

Include conf/extra/httpd-proxy.conf

Tomcat側も設定していきます。
インストールディレクトリを「/opt/tomcat-9.0.34-ex」とした場合に、「/opt/tomcat-9.0.34-ex/conf」ディレクトリの「server.xml」を編集します。
ajpのConnector設定の記載箇所について、8009番ポートを28009番ポートへ変更し、「secretRequired="false"」を記載します。
ApacheTomcatを再起動後、ブラウザで8080番ポートにアクセスすると、以下のようにTomcatの画面が表示されます。
f:id:J-back:20200504160613p:plain:w600

最後に

以上で、Tomcatインスタンスを2つ起動し、それぞれのインスタンスに対してApacheから通信を転送することができました。
最後まで読んでいただき、ありがとうございました。