概要
jconsoleで Windows PC から Linux サーバ上で稼動している Tomcat サーバに対して接続し、リソース使用状態を監視する方法についてまとめた。このjconsole、「接続しようとしても接続できない」という問題に結構出会う。
しかも「何が問題か」を教えてくれない。
以前にもこの現象に出会って時間を取られてしまったにもかかわらず、メモを残していなかったので、また調査するはめに...orz
無駄な時間を今後費やすことがないよう、自分が出会ったトラブルについてまとめた。
jconsoleとは
Sun JDK 6 の中には、コンパイラ javac の他にも、いくつか役に立つツールが含まれている。jconsole は、Java プログラムに対し、次のような情報を得ることができる。
- パフォーマンス情報
- メモリの使用状態
- 稼働中のスレッドに関する情報
- JMX
Sun による解説ページはこちら
Javaサーバが稼動するホストにおける準備
まず、hostname -i を実行する。127.0.0.1 が返ってきた場合、まずこれを解決する必要がある。# hostname -i 127.0.0.1
/etc/hosts を修正する
127.0.0.1 が返ってくる場合、/etc/hosts を見ると、おそらく次のように記述されていると思う。# cat /etc/hosts 127.0.0.1 localhost foo.bar.jpこれを、次のように修正する。foo.bar.jp に対し、このホストのIPアドレスを記述する。
# cat /etc/hosts 127.0.0.1 localhost 192.168.1.2 foo.bar.jp再度、hostname -i を実行して確認し、ホストのIPアドレスが返ってきたらOK。
# hostname -i 192.168.1.2
ホストに複数のIPアドレスが設定されている場合は?
例えば1つのホストにローカルIPとグローバルIPのように2つが設定されているようなケースでは、「管理用PCから接続するときの IPアドレス」が hostname -i で返ってこなければならない。Javaサーバの起動スクリプトの修正
tomcat を起動するときの Java のパラメータに、次のオプションを追加する。-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7900 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
Fedora 8 の場合
Fedora 8(F8) に対し rpm で tomcat5 をインストールした場合、起動時パラメータの修正は/etc/tomcat5/tomcat5.conf で行う。例えば、ファイルの最後尾に次の記述を追加する。
改行せず、1行につなげる
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=7900
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
設定後、tomcat を起動する。
# service tomcat start
ファイアウォールに穴をあける
例えば、Java サーバに iptables でパケット・フィルタリングを実施している場合、「管理PCから jmx ポートへのアクセスを許可」の設定を行う必要がある。ここで注意しなければならないのが、この機能では次の2つのポートを空ける必要があること。
- com.sun.management.jmxremote.port で指定したポート (上記例では 7900)
- そのポート~65535
改行せず、1行につなげる
-A RH-Firewall-1-INPUT -m state --state NEW
-m tcp -p tcp -s 192.168.1.100 --dport 7900:65535 -j ACCEPT
これで準備完了!
jconsole の使い方
Windows PC 上で jconsole.exe を起動する。jconsole.exe は次の場所にある。C:\Program Files\Java\jdk1.6.0_05\bin次の画面が表示されたら、
「リモートプロセス」のところに、
192.168.1.2:7900 のようにホスト名とポート番号を入力し、[接続] ボタンを押す。
トラブルシューティングまとめ
jconsole でリモートの Java サーバに接続しようとしても接続できない時、次の点をチェックする。- サーバ側で hostname -i を実行したときに表示される IP アドレスは、 jconsole で接続しにいくときと同じ IP アドレスか。
- /etc/hosts を修正する。
- ホスト名を変更する場合は、次の手順で行う。
# hostname foo.bar.jp (現在のホスト名が表示される) # hostname -i 200.100.50.25 このホストの eth0 の IPアドレスが表示される # hostname foo.bar.local ホスト名を変更する # hostname foo.bar.local # hostname -i 192.168.1.2 このホストの eth1 の IPアドレスが表示される
tomcat 起動後に /etc/hosts を修正したときは、tomcat を再起動すること。
- ファイアウォールで適切なポート番号を空けているか。
接続時にパスワードを要求するには?
java 起動時オプションから-Dcom.sun.management.jmxremote.authenticate=false を削除する。次に、サーバ上で次の作業を行う。
# cd /usr/java/default/jre/lib/management
# less jmxremote.access
ユーザ名 monitorRole に対し、readonly の権限が付与されている。
このユーザに対し、パスワードを設定する。
# cp jmxremote.password.template jmxremote.password
# vi jmxremote.password
最後尾に次のようにパスワードを設定する。
プレインテキストであるため、普段使っているパスワードを使用しないこと!
monitorRole hogehoge
# chmod 600 jmxremote.password
# chown tomcat jmxremote.password
なお、jdk を rpm でアップグレードした際、この辺りの修正は引き継がれないので、その際は忘れずにチェックすること。または、JAVA 起動時のオプションにて、管理ファイルやパスワードファイルのありかを指定できる。 詳細は Sun の解説ページ を参照のこと。