web-dev-qa-db-ja.com

リモートJMX接続

リモートマシンで実行されている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

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

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

両方のサーバーはWindows Server 2008 x64です。 64ビットJVMと32ビットで試してみましたが、どちらも機能しません。

90
tuler

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

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

システム変数Java.rmi.server.hostname="YOUR_IP"を使用してプログラムを呼び出すには、環境変数として、または

Java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
110
takete.dk

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

次のコマンドが実際のIPまたはHOSTNAMEを返すことを確認してください。 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が返すものと一致する必要があります。

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

59
sorin

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

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

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

19
LeslieM

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

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

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

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

12
h0nIg

終わりの引用が早すぎるということです。最後のパラメーターの後でなければなりません。

このトリックはうまくいきました。

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

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を使用して同じホストから接続しているときは、実際の物理的なリモートホストからのみこの問題は発生しませんでした。したがって、このチェックは、接続が「外部」から来ている場合にのみ行われると思います。

8

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

cat/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
Maoz Zadok

どうもありがとう、次のように動作します:

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

5
user3406690

私はこのスレッドがかなり古いことを知っていますが、大いに役立つ追加のオプションがあります。こちらをご覧ください: https://realjenius.com/2012/11/21/Java7-jmx-tunneling-freedom/

-Dcom.Sun.management.jmxremote.rmi.port=1099

1

JMXリモートを有効にするには、VMパラメーターとJavaコマンドを一緒に渡します。

    -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
0
Ajay Kumar

私は同じ問題を抱えており、ローカルホスト名に一致するホスト名を0.0.0.0に変更します。

0
ianpojman