Javaアプリの管理や監視を行う為のインターフェースであるJMX(Java Management Extensions)を使って、Javaに付属している「jconsole」から、TomcatのJava VM を監視するための設定を行いました。作業手順を記録しておきます。
1.Tomcat側でJMX設定
まずは、TomcatのJavaVM側で、リモートノードからJMXを使えるように設定を行います。
利用するTomcatは 7.0.39 です。
「$CATALINA_BASE」を「/usr/local/tomcat」だとすると、/usr/local/tomcat/bin/catalina.sh を使ってTomcatのオペレーション(起動や停止等)を行っています。その為、まずは、catalina.sh を見て、JMX設定を入れるべき箇所を探しました。すると、以下のコメントが見つけられます。
# CATALINA_OPTS (Optional) Java runtime options used when the "start", # "run" or "debug" command is executed. # Include here and not in JAVA_OPTS all options, that should # only be used by Tomcat itself, not by the stop process, # the version command etc. # Examples are heap size, GC logging, JMX ports etc. # # JAVA_OPTS (Optional) Java runtime options used when any command # is executed. # Include here and not in CATALINA_OPTS all options, that # should be used by Tomcat and also by the stop process, # the version command etc. # Most options should go into CATALINA_OPTS.
これによると、JMX設定は「JAVA_OPTS」ではなく「CATALINA_OPTS」で設定すれば良さそうです。
「CATALINA_OPTS」を設定する箇所を探してみると、別途新規に「setenv.sh」を作成し、その中で定義すれば良さそうです。
よって、catalina.sh と同じ場所ですが、「/usr/local/tomcat/bin/」に setenv.sh を作成します。そうすると、catalina.sh から setenv.sh が読み込まれる形になります。
設定内容 は以下になります。この設定で、リモートノードからJMXを使って(認証は行わずに)Tomcat の Java VM を監視できるようになります。
# cat setenv.sh #!/bin/sh export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=10080 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" #
portは「10080」としていますが、環境に合致したポート番号を使っても問題ありません。
以下のように実行権限を与えておきます。
# chmod 755 setenv.sh
これで、Tomcat側でのJMX設定は完了となりますので、Tomcatを再起動します。
# ps -awef|grep java|grep -v grep
root 19780 1 0 May06 ? 00:00:09 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
#
# /usr/local/tomcat/bin/catalina.sh stop
# ps -awef|grep java | grep -v grep
# /usr/local/tomcat/bin/catalina.sh start
# ps -awef|grep java|grep -v grep
root 25059 1 11 11:29 pts/0 00:00:03 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=10080 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
#
再起動後に、psコマンドによるプロセス確認でも、jmxremote の設定が反映されている事が確認できました。(上記の青色部分)
2.FireWallで、JMX接続ポートへの導通を許可
リモートノードからJMXを使って接続できるようにする為に、先ほど setenv.sh で指定したJMXポートに対する接続をFireWallで開放します。
私の環境では、iptables を使っているので、iptables での設定を以下に記載しておきます。
# iptables --list --line-number (←番号確認) # iptables --insert INPUT (番号) -p tcp -s (ソースIP) --dport 10080:65535 -j ACCEPT # iptables --list --line-number (←追加確認) # /sbin/service iptables save (←ファイルへ保存) # cat /etc/sysconfig/iptables (←保存ファイルを確認)
なお、setenv.sh の jmxremote.port では「10080」を指定していますが、iptables での「dport」設定では「10080 から65535まで」というレンジで許可設定を入れています。「10080」だけの場合は、以下のように jconsole で接続エラーが発生する為です。
3.jconsole での接続
ここまでの手順で、Tomcat Java VM へのリモートからのJMX接続設定が完了し、経路にあるFireWallでの通信許可設定も完了しています。
よって、次は jconsole を起動し、接続確認を行います。
jconsole を起動する私の端末は、Windows7で「JDK 1.7.0_17」 が入っています。jconsole は JDK に含まれており、配置されている場所は「C:\Program Files\Java\jdk1.7.0_17\bin\jconsole.exe」です。コマンドプロンプトで jconsole を起動します。
C:\Program Files\Java\jdk1.7.0_17\bin>jconsole
すると、「Java Monitoring & Management Console」が起動します。起動後、しばらくした画面となりますが、以下がサンプル画面です。
jconsole では、以下のようなタブで画面を切り替えられますので、必要に応じて各画面を参照できます。
以上のように、jconsole を使って、JMXでの接続確認や、Tomcatの監視、その他のJava VM監視を簡易的に行う事ができます。監視ツールでの設定を行う際にもMBeansの値確認などで重宝すると思います。