リモートJMX接続


96

リモートマシンで実行されているJavaアプリケーションへのJMX接続を開こうとしています。

アプリケーションJVMは、次のオプションで構成されます。

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port = 1088
  • com.sun.management.jmxremote.authenticate = false
  • com.sun.management.jmxremote.ssl = false

localhost:1088jconsoleまたはjvisualvm を使用して接続できます。しかしxxx.xxx.xxx.xxx:1088、リモートマシンを使用して接続することができません。

サーバー間、またはOS上にファイアウォールはありません。しかし、この可能性を排除するためにtelnet xxx.xxx.xxx.xxx 1088、コンソール画面が空白になるので、私は接続すると思います。

どちらのサーバーもWindows Server 2008 x64です。64ビットJVMと32ビットで試したが、どちらも機能しなかった。



詳細なガイドはこちらstackoverflow.com/a/11654322/99834
sorin

回答:


117

Linuxで問題が発生した場合、問題はlocalhostがループバックインターフェイスであることです。ネットワークインターフェイスにバインドするアプリケーションが必要です。

netstatを使用して、予想されるネットワークインターフェイスにバインドされていないことを確認できます。

これを機能させるにjava.rmi.server.hostname="YOUR_IP"は、環境変数として、または使用して、システムパラメータを指定してプログラムを呼び出します。

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

7
を忘れないでください。詳細についてはhostname -istackoverflow.com / a / 11654322/99834を参照してください。
ソリン

働きました!私たちの環境では、VMWare仮想マシンを使用しています。サーバーはVM上にありました。VMはフェンスされてデプロイされたため、内部IPアドレスと外部IPアドレスを持っています。-Djava.rmi.server.hostname = <external-ip-address>を使用してサーバーJavaプロセスを開始しました。
buzz3791 2013年

ホストIPを設定するか、ローカルホストIPを変更するには、このリンクが役立ちます。
Reza Ameri 2014

ここで2つの質問があります。1)JMXではなくJMXMPを使用したい場合はどうしますか。そのための構成は何でしょうか?および2)RMIプロトコルをロードせずにJMX接続を行うことは可能ですか?
Kumar Vaibhav 2015

64

JMXをlocalhostの外部から機能させるために1日以上費やしてきました。SUN / Oracleはこれに関する適切なドキュメントを提供できなかったようです。

次のコマンドで、実際のIPまたはホスト名が返されることを確認してください。127.0.0.1、127.0.1.1、またはlocalhostなどが返された場合、機能せず、/etc/hostsファイルを更新する必要があります。

hostname -i

これは、外部からでもJMXを有効にするために必要なコマンドです

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

想定どおり、myserver.example.comはhostname -i返されるものと一致する必要があります。

明らかに、ファイアウォールがあなたをブロックしないことを確認する必要がありますが、これがあなたの問題ではないことはほぼ確実です。問題は文書化されていない最後のパラメーターです。


-Djava.rmi.server.hostname = myserver.example.comを追加するとうまくいきました!ありがとう!
ジムベサンコート2014

私はJDKのドキュメントバグを自由に開くことができました:bugs.openjdk.java.net/browse/JDK-8066405
Klara

2
「次のコマンドで実際のIPまたはHOSTNAMEが返されることを確認してください。127.0.0.1、127.0.1.1、またはlocalhostなどが返される場合は機能せず、/ etc / hostsファイルを更新する必要があります。」何?
PedroD

1
簡単なことではありませんjava.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>。これが誰かを助けることを願っています。
Sonny

24

TomcatとJava 8を使用したテストでは、JVMはJMXに指定されたポートに加えて一時的なポートを開いていました。次のコードで修正されました。JMXクライアント(たとえば、VisualVMが接続していない)で問題が発生している場合は、試してみてください。

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

JMXが構成されているときにJavaが3つのポートを開く理由も参照してください


12

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

NATの背後にあるサーバーにアクセスしようとしている場合-ほとんどの場合、オプションでサーバーを起動する必要があります

-Djava.rmi.server.hostname=<public/NAT address>

これにより、クライアントに送信されるRMIスタブにはサーバーのパブリックアドレスが含まれ、外部からクライアントがアクセスできるようになります。


8

それはあなたの最後の引用が早すぎるということを縫い合わせます。最後のパラメータの後にある必要があります。

このトリックは私のために働いた。

次のコマンドラインを使用してアプリケーションを起動すると、興味深いことに気づきました。

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

jconsoleを使用してリモートマシンからこのポートに接続しようとすると、TCP接続は成功し、MBeanがデプロイされているリモートjconsoleとローカルjmxエージェント間で一部のデータが交換され、jconsoleが接続エラーメッセージを表示します。私はwiresharkキャプチャを実行しましたが、エージェントとjconsoleの両方からのデータ交換を示しています。

したがって、これはネットワークの問題ではありません。java.rmi.server.hostnameシステムプロパティの有無にかかわらずnetstat -anを実行すると、次のバインディングが得られます。

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

つまり、どちらの場合でも、ポート9999で作成されたソケットは、任意のアドレスの任意のホストからの接続を受け入れます。

このシステムプロパティの内容は接続のどこかで使用され、jconsoleとの通信にエージェントが使用する実際のIPアドレスと比較されると思います。そして、それらのアドレスが一致しない場合、接続は失敗します。

jconsoleを使用して同じホストから接続しているときは、この問題はありませんでした。実際の物理リモートホストからのみです。したがって、このチェックは接続が「外部」から行われている場合にのみ行われると思います。


「あなたの結末の引用が早すぎる」とはどういう意味ですか?同じ問題があります。TCP接続が確立されているのがわかりますが、最終的にjconsoleは接続に失敗したと主張します。
津名

よくわかりませんが、どこかで引用符が開いていて、この引用符がパラメーターの最後になかったのです。多分それはバッチスクリプトだったのかもしれません。しかし、私はこの回答が質問に関して意味をなさないことを認めなければなりません...多分質問は編集されましたか?質問の下に編集された通知はありません...わかりません、ごめんなさい。
yohann.martineau 2013

6

私にとってうまくいったのは、/ etc / hostsを設定して、ホスト名をループバックインターフェイスではなくIPにポイントし、その後アプリケーションを再起動することでした。

猫/ etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

これは私の設定です:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

5

どうもありがとう、それはこのように機能します:

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false- Dcom.sun.management.jmxremote.port = 25000 -jar myjar .jar



0

私は同じ問題を抱えており、ローカルホスト名と一致するホスト名を0.0.0.0に変更すると、それを実行した後に機能するようです。


0

JMXリモートを有効にするには、JAVAコマンドとともに以下のVMパラメーターを渡します。

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in

1
特定のIPではなく0.0.0.0にバインドされる理由を教えてください
Babu James

0

これを試して、Dockerコンテナー内のJMXへのアクセスをテストしました

-Dcom.sun.management.jmxremote = true -Djava.rmi.server.hostname = localhost -Dcom.sun.management.jmxremote.port = 16000 -Dcom.sun.management.jmxremote.rmi.port = 16000 -Dcom.sun .management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false

その後

$ jconsole localhost:16000


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.