web-dev-qa-db-ja.com

jConsoleを使用してリモートTomcat JMXインスタンスを接続する

JConsoleを使用してリモートTomcat JMXインスタンスに接続しようとしています。しかし、正常に接続できません。何か案が?

リモートTomcatに次のオプションを含めましたcatalina.sh

Java_OPTS="$Java_OPTS -Dcom.Sun.management.jmxremote \
    -Dcom.Sun.management.jmxremote.port=9004 \
    -Dcom.Sun.management.jmxremote.ssl=false \
    -Dcom.Sun.management.jmxremote.authenticate=false"
55
Niger

同じではないにしても、似たような問題がありました。マシンでローカルにjconsoleを起動した場合、JMXサーバーに接続できました。

RMIサーバーが正しいIPでリッスンしていないようです。 この関連する質問 で提案されたように、私は次を追加しました:

-Djava.rmi.server.hostname=<Host ip>

Java_OPTS同様に、そしてそれは働いた。

63
waxwing

私は、他のメンバーからのヒントを見つけて、ネット上に広がる情報を収集しました。

JMXによって引き起こされるほとんどの痛みは、(imo)JMXが2番目に動的に割り当てられたネットワークポートを開くという事実です。ファイアウォール(iptablesなど)がこれをブロックします。

LinuxでのTomcatのソリューション:

tomcat 6.0.24以降を使用し、Apache Tomcat extrasからcatalina-jmx-remote.jarをダウンロードします(Tomcatダウンロードページで参照します)。これを$ CTALINA_HOME\libにコピーします

これにより、JMXが使用する両方のポートを設定できます

server.xmlのServerセクションを編集します

<Server port="8005" ..>
  ...
  <Listener className="org.Apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>

いくつかの環境変数を設定します(例:setenv.sh)

CATALINA_OPTS="
  -Djava.rmi.server.hostname=IP-TO-LISTEN
  -Dcom.Sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password 
  -Dcom.Sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access 
  -Dcom.Sun.management.jmxremote.ssl=false"

これにより、JMXのアクセス制御が有効になります

jmxremote.accessは次のようになります

monitorRole readonly
controlRole readwrite

終了jmxremote.passwordは

monitorRole Tomcat
controlRole Tomcat

(単なるスペース)

tomcatを再起動します。

サーバーでファイアウォールを構成します(例:iptables)

/ etc/sysconfig/iptables

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT

および/ etc/sysconfig/ip6tables

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT

iptablesを再起動します

できた!

ここで、ワークステーションでVisualVMまたはJConsoleを使用して、rmiRegistryPortPlatform(サンプルでは9840)への接続を確立します。

ワークステーションとサーバーの間にファイアウォールがもうない場合は、動作するはずです。

36
Hajo Thelen

Java 8

1.これをJava Tomcat起動スクリプトに追加します。

-Dcom.Sun.management.jmxremote.port=1616
-Dcom.Sun.management.jmxremote.rmi.port=1616
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

たとえば、これをbin/setenv.shに追加します。

export CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.Sun.management.jmxremote.port=1616 \
-Dcom.Sun.management.jmxremote.rmi.port=1616 \
-Dcom.Sun.management.jmxremote.local.only=true \
-Dcom.Sun.management.jmxremote.authenticate=false \
-Dcom.Sun.management.jmxremote.ssl=false "

2.コンピューターでこれを実行します。

  • Windowsユーザー

    PuTTY.exe -ssh user@remote-Host -L 1616:remote-Host:1616

  • LinuxおよびMacユーザー

    ssh user@remote-Host -L 1616:remote-Host:1616

3.コンピューターでjconsoleを起動します

jconsole localhost:1616

4.楽しんでください!

  • 追伸:ステップ2では、ssh-Lを使用して、ローカル(クライアント)ホストのポート1616をリモート側に転送することを指定します。
  • P.S.2 .: JMXとRMIの会話に同じポートを指定できます
11
freedev

jMX接続URLとして使用している文字列。明らかなことを指摘するつもりはありませんが、JConsoleにはひどいインターフェイスがあり、リモートjmxアプリに接続する前に非常に複雑なURLが必要です。私のものは次のようになります。

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi
8
Matt

Tomcat8でJMXを有効にし、POCで正常にテストしました

1/Apache Webサイトからcatalina-jmx-remote.jarをダウンロードし、$CATALINA_HOME/libに配置します。

2/server.xml/setenv.shバックアップを取得します。以下のようにserver.xmlに変更を加えます-

<Listener className="org.Apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

3/$CATALINA_BASE/bin/setenv.shに変更を加えます-

[...]

JVM_OPTS="[...] 
-Dcom.Sun.management.jmxremote 
-Dcom.Sun.management.jmxremote.authenticate=true 
-Djava.rmi.server.hostname=<eth:0_IP>| <`hostname -i`> 
-Dcom.Sun.management.jmxremote.password.file=/apps/data/Apache-Tomcat-8_8080/conf/jmxremote.password 
-Dcom.Sun.management.jmxremote.access.file=/apps/data/Apache-Tomcat-8_8080/conf/jmxremote.access 
-Dcom.Sun.management.jmxremote.ssl=false 
-Dcom.Sun.management.jmxremote.local.only=false 
-Dcom.Sun.management.jmxremote=true "

4 /以下の2つのファイルを作成します-$touch $CATALINA_BASE/conf/jmxremote.password次を含む:

管理者letmein

$touch $CATALINA_BASE/conf/jmxremote.accessを含む:

管理者readwrite

$ chmod 600 jmxremote.password

5/Tomcatを再起動し、jconsoleツールでテストします:)

$echo|telnet 10.105.14.90 10001
3
Bkkv

「しかし、正常に接続できません」と言うとき、正確にはどういう意味ですか?エラーメッセージはありますか? jconsoleでログを有効にして、デバッグに役立つかどうかを確認してください。

Jconsoleロギングを有効にするには、jconsoleを実行するディレクトリでlogging.propertiesという名前のファイルを編集し、次を追加します。

handlers= Java.util.logging.ConsoleHandler

.level=INFO

Java.util.logging.FileHandler.pattern = %h/Java%u.log
Java.util.logging.FileHandler.limit = 50000
Java.util.logging.FileHandler.count = 1
Java.util.logging.FileHandler.formatter = Java.util.logging.XMLFormatter

Java.util.logging.ConsoleHandler.level = FINEST
Java.util.logging.ConsoleHandler.formatter = Java.util.logging.SimpleFormatter

javax.management.level=FINEST
javax.management.remote.level=FINEST

次に、次を使用してjconsoleを起動します。

jconsole -J-Djava.util.logging.config.file=logging.properties
2
joe p

linuxで作業している場合は、catalina.shファイルを変更して以下を追加します。

                CATALINA_OPTS="-Dcom.Sun.management.jmxremote -Djava.rmi.server.hostname=<Host_IP> -Dcom.Sun.management.jmxremote.port=<Host_PORT> -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false"
            export CATALINA_OPTS

または/ etc/profileファイルをルートとして変更し、ファイルを再実行します(ソース/ etc/profile)

windowsで作業していて、コマンドラインからTomcatを起動している場合は、環境変数CATALINA_OPTSを使用します

windowsで作業していて、Tomcatをサービスとして起動している場合、モニターサービスユーティリティを使用してサービス初期化パラメーターを設定する必要があります(setenv.bat、catalina.bat、env-varsのいずれも機能しません)。そのためには、services.mscにリストされているサービス名(jasperreportsTomcatなど)が必要です。その後、管理者としてコンソールを開いて実行する必要があります(たとえば):Tomcat6w.exe // MS // jasperreportsTomcat

このコマンドを使用すると、パネルを開くことができるトレイアイコンが表示されます。 [Java]タブで、jmxオプションを変更できます。末尾の空白を追加しないように注意し、「[enter]」記号を使用して各オプションを行ごとに区切ります。

-Dcom.Sun.management.jmxremote
-Djava.rmi.server.hostname=192.168.61.101
-Dcom.Sun.management.jmxremote.port=9999
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.authenticate=false

それが役に立てば幸い

2
andhdo

サーバーがファイアウォールの内側にあるかどうかを確認してください。 JMXはRMIに基づいており、起動時に2つのポートを開きます。 1つはレジスタポートで、デフォルトは1099です。com.Sun.management.jmxremote.portオプションで指定できます。もう1つはデータ通信用で、ランダムです。これが問題の原因です。良いニュースは、JDK6から、このランダムなポートをcom.Sun.management.jmxremote.rmi.portオプションで指定できることです。

{Tomcat_dir} /bin/setenv.shに次の行を追加します。

export CATALINA_OPTS="-Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=8991 -Dcom.Sun.management.jmxremote.rmi.port=8991 -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.ssl=false"
1
arganzheng

このすべての調査を完了するために、私はあなたのすべてのために何かを得ました。トリックがあります。プロファイラーツールはポートを使用してjvmと接続しますが、jvmは別のランダムポートを使用して会話を続行します。 jvmがリモートマシン(たとえば、Tomcat web-appサーバー)内で実行されており、リモートマシンが発信および着信接続に対して保護されている場合、Javaシステムプロパティcom.Sun.management.jmxremote.rmi.portcom.Sun.management.jmxremote.portという名前のプロパティの同じ値に

ソース: https://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error また、これもチェックしてください: http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

みんなに貢献したい!

そして成功を祈る!

1
Victor

さて、Linuxボックス(仮想マシン)でこの問題が発生し、-Djava.rmi.server.hostnameプロパティを使用して修正しましたが、理解できないことがあります。私のマシンには5つのTomcatサーバーがあり、すべてのサーバーで連続ポート(8008、8018、8028 ...)でjmxが有効になっており、JMXの接続でこの問題が発生したのはそのうちの1つだけでした。ファイアウォールなし、Tomcatに-Djava.rmi.server.hostnameプロパティなし...

そのため、問題は理解できますが、Tomcatのうち4つが機能し、1つが機能しなかった理由を理解できません。

P.D:私の英語はとても下手です。謝罪いたします。

0
Icarokun

Linuxで/etc/hostsを変更して、アカウントに関連付けられたローカルホストアドレスをマシンのIPに置き換えたので、この問題は解決しました。

0
PedroG

PROTIP:RMIレジストリとJMX/RMIサーバーのポートを修正する必要があります(既知の番号を持っている場合など)。これを行うには、jarファイルをlib-dirに配置し、特別なリスナーを設定します。 (もちろん、JMXをアクティブにするための通常のフラグ

    -Dcom.Sun.management.jmxremote  \
    -Dcom.Sun.management.jmxremote.port=8999 \
    -Dcom.Sun.management.jmxremote.ssl=false \
    -Dcom.Sun.management.jmxremote.authenticate=false \
    -Djava.rmi.server.hostname=<HOSTNAME> \

参照: http://Tomcat.Apache.org/Tomcat-6.0-doc/config/listeners.html のJMX Remote Lifecycle Listener

0
supdog