jconsole で Tomcat7 をモニタリングするには、起動スクリプトで次のように JAVA_OPTS を指定します。
準備
ここでは、ファイアウォールを越えたりする場合のことも考えて、リモートから接続するにあたっては SSH ポートフォワードで接続する方法を使ってみます。
- tomcat.localdomainというホストでtomcatを稼働しているとします。
- tomcat.localdomainのマシンでは、/usr/java/jdk1.7.0_17 に JDK7 をインストールし、Tomcat を $HOME/applications/apache-tomcat-7.0.37 へインストールしておきます。
- クライアントマシンではJDK7は$HOME/applications/java/jdk1.7.0_17にインストールしておきます。
- Tomcat のサイトから Extras: JMX Remote jar (catalina-jmx-remote.jar)をダウンロードしておきます。
ローカルマシン
まずは次のようなスクリプトを用意して、同じマシンで Tomcat7 と jconsole を使ってみましょう。
#!/bin/sh CATALINA_HOME=$HOME/applications/apache-tomcat-7.0.37 JAVA_HOME=/usr/java/jdk1.7.0_17 JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=127.0.0.1" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9993" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false" export JAVA_HOME export JAVA_OPTS CATALINA_HOME/bin/startup.sh
ローカルマシンからアクセスをするときの jconsole は下記コマンドで起動します。
$ /usr/java/jdk1.7.0_17/bin/jconsole
プロセスで tomcat のものを選択してから接続としてもよいですし、ネットワーク経由で、localhost:9993 を指定して接続してもよいです。開発マシンではこのようにローカルマシンで動かすことも多いでしょう。Eclipseからの接続もlocalhost:9993でいけるので、簡単に使えることがわかります。
リモートマシン
次にリモートマシンで動作するTomcatへクライアントマシンから接続をする場合の設定についてみてみましょう。
ネットワーク経由でちがうマシンからの接続となると、JMX + RMI が使用されるので、Tomcat のサイトから Extras: JMX Remote jar (catalina-jmx-remote.jar)をダウンロードして $CATALINA_HOME/lib ($HOME/applications/apache-tomcat-7.0.37/lib)へおく必要があります。
$CATALINA_HOME/conf/server.xml で Listener 要素を追加します。いくつか Listener 要素が記述されているはずなので、そこへ下記を追加してください。
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" useLocalPorts="true" rmiRegistryPortPlatform="9993" rmiServerPortPlatform="9994"/>
先ほど作成したTomcat用の起動スクリプトも下記のように変更します。
#!/bin/sh CATALINA_HOME=$HOME/applications/apache-tomcat-7.0.37 JAVA_HOME=/usr/java/latest JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=localhost" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote=true" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false" export JAVA_HOME export JAVA_OPTS $CATALINA_HOME/bin/startup.sh
準備ができたら、Tomcatを再起動しておきます。
それでは、クライアントマシンからの接続をしてみましょう。次のようなツール用ディレクトリを用意して、jconsole を使います。JMX Remote jar (catalina-jmx-remote.jar)がクライアントにも必要だという点に注意しましょう。
jconsole/ |-- bin | `-- start.sh `-- lib `-- catalina-jmx-remote.jar
スクリプト start.sh の内容は次のようになります。SSHポートフォワードを停止する stop.sh も用意するといいかもしれません。そちらは自分で考えてみてください。
#!/bin/sh JAVA_HOME=$HOME/applications/jdk7 cf=`readlink -f $0` d=`dirname $cf` TOOL_HOME=${d}/.. ssh -f -N -L9993:localhost:9993 -L9994:localhost:9994 tomcat.localdomain $JAVA_HOME/bin/jconsole \ -debug \ -J"-Djava.class.path=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jconsole.jar:$TOOL_HOME/lib/catalina-jmx-remote.jar" \ service:jmx:rmi://localhost:9994/jndi/rmi://localhost:9993/jmxrmi
なお、MacOS X では JAVA_HOME や java.class.path の指定は下記ようにすると良いでしょう。readlinkコマンドも挙動がLinuxとはちがうので使わないようにする必要があります。Mountain Lion でない場合は、JAVA_HOMEには「/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home」などを指定する必要があるかもしれません。
#!/bin/sh JAVA_HOME=`/usr/libexec/java_home -v 1.7` SYSTEM_JAVA="/System/Library/Frameworks/JavaVM.framework" d=`dirname $0` TOOL_HOME=${d}/.. ssh -f -N -L9993:localhost:9993 -L9994:localhost:9994 tomcat.localdomain $JAVA_HOME/bin/jconsole \ -debug \ -J"-Djava.class.path=$SYSTEM_JAVA/Classes/classes.jar:$SYSTEM_JAVA/Classes/jconsole.jar:$TOOL_HOME/lib/catalina-jmx-remote.jar" \ service:jmx:rmi://localhost:9994/jndi/rmi://localhost:9993/jmxrmi
Java7 でのモニタリングについては、「Monitoring and Management Using JMX Technology – Java SE Monitoring and Management Guide」が参考になります。Apache Tomcat7 でのモニタリングについては「Apache Tomcat 7 Configuration Reference (7.0.37) – The LifeCycle Listener Component」が参考になります。