1. はじめに
JavaのWebアプリ開発でServletエンジンとして Apache Tomcat が使われることが多いのではないでしょうか。一般的な書籍や研修等で簡単な使い方は教わりますが、同一ホスト上で複数のTomcatインスタンスを起動させる方法はあまり知られておらず、若手メンバがよく質問されるので今回はその方法について説明したいと思います。なおTomcatはサービスではなく、利用時にコマンドで起動させるZip版を対象とします。
2. 環境変数を定義する
Java開発ではJAVA_HOME
、MAVEN_HOME
等、XXX_HOME
というディレクトリを指定する環境変数がよく使われます。Tomcatの場合も同様でTomcatのインストールディレクトリはCATALINA_HOME
となります。
複数Tomcatを起動させるポイントはCATALINA_HOME
に加えてCATALINA_BASE
という別のTomcatインスタンス用の環境変数を定義することです。
変数 | 値 | 説明 |
---|---|---|
JAVA_HOME | C:¥tools¥corretto¥jdk17.0.12_7 | JDKのインストールディレクトリパス 例はCorretto 17.0.12_7 |
CATALINA_HOME | C:¥tools¥apache-tomcat-10.1.26 | Tomcatのインストールディレクトリ 例はTomcat10.1.26 |
CATALINA_BASE | C:¥tools¥apserver_2 | 2つ目のTomcat起動用のディレクトリ 例はC:¥tools¥apserver_2 このディレクトリに別Tomcatで必要なファイル等を格納する |
3. ディレクトリ構成
Tomcatの実行に必要なファイル(bin,lib)はCATALINA_HOME
配下のものが使われます。CATALINA_BASE
は別Tomcatインスタンスの起動に必要なものだけ準備する構成になります。ディスク容量も節約できる素晴らしい構成ですね。
CATALINA_HOME
|-- bin
|-- conf
|-- lib
|-- logs
|-- temp
|-- webapps
|-- work
CATALINA_BASE
|-- conf # CATALINA_HOME/confをコピー
|-- logs # 存在しない場合、自動で作成される
|-- temp # 存在しない場合、自動で作成される
|-- webapps # 実行させたいWebアプリを格納する
|-- work # 存在しない場合、自動で作成される
4. 設定ファイルをコピー&修正する
複数Tomcatを起動させる上で考慮すべきことは、ポート番号やログファイル等のリソースの競合です。あるプログラムがリッスンしているポートを別のプログラムでリッスンしようとするとAddress already in use
のエラーになります。ログファイルについてもオープンしてロックをしているので、他のアプリから同じログファイルに書き込むことはできません。
Tomcatではこれらの設定はconfディレクトリ内のファイルで設定しているため、CATALINA_HOME/conf
をCATALINA_BASE/conf
にコピーしてリソース競合の箇所を別Tomcat用に変更します。
ポート番号で変更すべき箇所は8005
、8080
の2箇所、ApacheとTomcatを連携するためにAJP13を利用している場合は8009
も加えて3箇所になります。
<Server port="8005" shutdown="SHUTDOWN">
↓
<Server port="⭐️8005から被らない他のポート番号に変更" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1"
↓
<Connector port="⭐️8080から被らない他のポート番号に変更" protocol="HTTP/1.1"
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
↓
<Connector protocol="AJP/1.3"
address="::1"
port="⭐️8009から被らない他のポート番号に変更"
(参考)
Tomcat毎にconfを修正するのはメンドウで同じファイルを使いたいという場合、Tomcatのポート番号を環境変数で定義・変更する方法を参照ください。Tomcatを起動させる際に環境変数で差分を定義できるので便利かと思います。
@echo off
set JAVA_HOME=C:¥tools¥corretto¥jdk17.0.12_7
set CATALINA_HOME=C:¥tools¥apache-tomcat-10.1.26
set CATALINA_BASE=C:¥tools¥apserver_2
set SHUTDOWN_PORT=8006
set SERVER_PORT=8084
set AJP_PORT=8019
call %CATALINA_HOME%¥bin¥startup.bat
5. さいごに
今回は同一ホスト内で複数のTomcatインスタンスを起動させる方法について説明しました。わざわざTomcatを複数インストールして起動させようとしているメンバがいたので今回の記事としました。なお、複数のTomcatが起動できるようになると以下のケースで役立つのではないでしょうか。
- システム移行の対応等で異なるバージョンの新旧Tomcatを起動させ、現新比較したい
- クラスタやセッションレプリケーションを確かめたい