AWS EC2上のTomcatにJMX設定をしよう!

| コメントをどうぞ

はじめての方は初めまして、そうでない方はお久しぶりでございます。
DiceK Mikamiです。
諸事により長らくブログから遠ざかっておりましたが、戻って参りました。
決して嫌になったとかそういうんじゃないだからねっ!!
心機一転よろしくお願いいたします。
 
閑話休題
 
さて、4月になり春も真っ盛りと言う感じですが、
日本の社会人である私たちにとって4月とは新年度であり、
バタバタと忙しい日々かと思います。
新年度と言えば、、、そうですね新環境構築ですね。
今回は縁あって、EC2上に設置したTomcatに対してJMX設定を行いましたので、
その設定方法などを共有したいと思います。
これでリモート監視ができる!
 

検証環境

  • OS: Amazon Linux AMI release 2014.03
  • Java: JDK1.7.0
  • Tomcat: 7.0.5

 

リモートホスト(EC2側)の設定手順

1. Tomcatのserver.xmlにリスナーを登録する

素敵なことにJMX用のリスナーが用意されていますので、server.xmlにリスナーを追記します。

<Tomcat Home>/conf/server.xml

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10080" rmiServerPortPlatform="10081"/>

server.xmlの最初の方にリスナーが固まって記述されていますので、そのあたりに追加すれば良いです。
 

2. catalina-jmx-remote.jarをlibフォルダに追加する

リスナー登録だけでは動作してくれませんので、JMX用のライブラリ( catalina-jmx-remote.jar )をTomcatのlibフォルダに追加します。
最初から同梱されていることはほぼないと思いますので、以下から取得してください。

http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.50/bin/extras

バージョン配下にある「 bin/extras 」にjarファイルはありますので、利用するTomcatのバージョンにあわせてライブラリを取得してください。
ライブラリを取得しましたら「 $Tomcatホーム/lib 」配下に置きます。
 

3. Tomcat起動オプションを設定する

次にTomcatの起動オプションを追加します。
setenv.shを作成し、以下のオプションを追加します。

<Tomcat Home>/bin/setenv.sh

export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true
                      -Dcom.sun.management.jmxremote.ssl=false
                      -Dcom.sun.management.jmxremote.authenticate=false
                      -Djava.rmi.server.hostname=<ホスト名>"

bin配下にsetenv.shがある場合、起動時にデフォルトで呼ばれますので、別個に用意しています。
検証時には、設定するホスト名をEC2インスタンスを立ち上げた時のデフォルトホスト名を設定しました。
 

4. Outboundポートを開放する

今回の目的としてEC2上のTomcatをリモート監視すると言うことになりますので、外部から接続するためのポートを開放します。
これはAWSコンソールからの設定になります。
検証では10080ポートと10081ポートを利用しましたので、その2つのポートを開放しました。

EC2側での設定は以上になります。
 

クライアントからの接続手順

いよいよクライアントから接続します。
今回はjdkに付属しているjconsoleから接続してみます。(VisualVMでも接続できます)

$ jconsole service:jmx:rmi://localhost:10081/jndi/rmi://localhost:10080/jmxrmi

これで接続完了!
 

…….
……….. 
 

こ、こんなはずでは。。。

こ、こんなはずでは。。。


!!!!!
なん、、、だと、、、???

はいそうですね。
いくらポートを開放したところでセキュリティがバッチリきいているため接続はできなくて当然ですよね。
みなさんを試したんですよ。
リモートで接続するためにSSHトンネリングを利用しましょう。

$ ssh -i  @ -L 10080:localhost:10080 -L 10081:localhost:10081

これを実行した後、再度jconsoleを起動します。

$ jconsole service:jmx:rmi://localhost:10081/jndi/rmi://localhost:10080/jmxrmi

jmxsuccess
おお、ちゃんとグラフが見えるではないか。
 
ともあれ、これでリモートでTomcatを監視し放題になりました。
今回はコマンドラインと既存ツールを使って行いましたが、
SSHトンネリングとJMXのプロトコルを利用したアプリケーションを利用すればより良い監視ライフが送れることかと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>