Develop with pleasure!

福岡でCloudとかBlockchainとか。

Tomcatの複数起動

Tomcatのstartup.shコマンドを叩くとTomcatが起動するが、デフォルトだとTomcatインスタンスは1つしか起動しない。起動したTomcatインスタンスは基本的に1つのVM上で起動していることになる。当然ながらTomcatに複数のWebアプリケーションをデプロイしていたとしても、それらは1つのVM上で動作することになる。ヒープメモリの割当等もVM単位でしかできないため、メモリ制御もTomcatインスタンス毎となる。

で、システムの規模が大きくなったり、デプロイするWebアプリケーションが多くなったり、クラスタ構成を取りたい場合などは、Tomcatを複数インスタンス立ち上げたい。複数インスタンス立ち上げれば各インスタンス毎にメモリの割当も可能になるし、GCが走った際の処理の負荷も(運用的に考えると)分散される。

WebLogicとかは、管理サーバからインスタンスを作成できるが、ここでできたサーバもそれぞれサーバ単位にVMが起動してることになる。WebLogicの場合は、管理サーバでインスタンスの管理ができるが、Tomcatにはそういった機能は無いので、手作業でする必要がある。

Tomcatを複数起動する方法はいくつかある。

  • Tomcatを複数インストールする。
  • Tomcatの起動時に-configオプションでサーバの設定が定義されたserver.xmlの読込対象を変更する。
  • 環境変数CATALINA_BASEを定義し起動するTomcatのベースディレクトリを変更する。


Tomcatを複数インストールするというのは、同じTomcatを使用するのだから冗長であまり意味がない。-configオプションを使用すれば読み込むサーバ定義を変更できるが、ログの出力先や、temp領域などが競合してしまうため管理がしにくい。

となると、ベターな方法はTomcatの起動前に環境変数CATALINA_BASEを定義して起動する方法。通常CATALINA_BASEはTomcatをインストールしたフォルダと見なされるのでstartup.shする前に環境変数でCATALINA_BASEを再定義する必要がある。

定義するCATALINA_BASEディレクトリ配下には、それぞれ

  • conf
  • temp
  • webapps
  • work
  • logs


ディレクトリを作っておく必要がある。CATALINA_BASEを指定するとそのディレクトリ配下のリソースを使用してTomcatが起動することになる。
まぁ、一々環境変数を再定義するのはメンドウなので、CATALINA_BASE以下にbinディレクトリでも作って、こんなシェルでも用意しとくと便利。

 #!/bin/sh
 #
 # Startup script for the tomcat
 
 # Source function library.
 export TOMCAT_INSTANCE=Instance1
 export JAVA_HOME=/usr/local/jdk1.5.0_18
 export CATALINA_HOME=/usr/local/tomcat-5.5.27
 export CATALINA_BASE=/usr/local/tomcat-5.5.27/$TOMCAT_INSTANCE
 export JAVA_OPTS="-server"
 export CATALINA_OPTS="-Xms128m -Xmx256m -XX:PermSize=128m -XX:MaxPermSize=256m"
 
 case "$1" in
 'start')
         if [ -f $CATALINA_HOME/bin/startup.sh ]; then
             echo "Starting $TOMCAT_INSTANCE"
             $CATALINA_HOME/bin/startup.sh
         fi
         ;;
 'stop')
         echo "Stopping $TOMCAT_INSTANCE"
         $CATALINA_HOME/bin/shutdown.sh
         ;;
 'restart')
         $0 stop
         sleep 5
         $0 start
         ;;
 *)
         echo "Usage: $0 {start|stop|restart}"
         ;;
 esac
 exit 0

当然複数起動する場合は、CATALINA_BASE毎にserver.xmlに定義しているサーバのポートが被らないようにしておく必要がある。対象となるのは、

<Server port="8005" shutdown="SHUTDOWN">
...
<Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
...

<Connector port="8009"
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />


あたり。