リモートマシンで実行されているJavaアプリケーションへのJMX接続を開こうとしています。
アプリケーションJVMは、次のオプションで構成されます。
Jconsoleまたはjvisualvmを使用してlocalhost:1088
を使用して接続できます。しかし、リモートマシンからxxx.xxx.xxx.xxx:1088
を使用して接続することはできません。
サーバー間またはOS上にファイアウォールはありません。しかし、この可能性を排除するためにtelnet xxx.xxx.xxx.xxx 1088
とコンソール画面が空白になると接続すると思います。
両方のサーバーはWindows Server 2008 x64です。 64ビットJVMと32ビットで試してみましたが、どちらも機能しません。
Linuxで問題が発生した場合、localhostはループバックインターフェイスであり、アプリケーションをネットワークインターフェイスにバインドする必要があります。
Netstatを使用して、予想されるネットワークインターフェイスにバインドされていないことを確認できます。
システム変数Java.rmi.server.hostname="YOUR_IP"
を使用してプログラムを呼び出すには、環境変数として、または
Java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
ローカルホストの外部から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
が返すものと一致する必要があります。
明らかに、ファイアウォールがあなたをブロックしないことを確認する必要がありますが、これはあなたの問題ではなく、文書化されていない最後のパラメータであるとほぼ確信しています。
TomcatとJava 8を使用したテストでは、JVMはJMXに指定されたポートに加えて一時ポートを開いていました。次のコードで修正されました。 JMXクライアント(たとえば、 VisualVM が接続していない問題がある場合は、試してみてください。
-Dcom.Sun.management.jmxremote.port=8989
-Dcom.Sun.management.jmxremote.rmi.port=8989
JMXが設定されているときにJavaが3つのポートを開く理由 も参照してください。
http://blogs.Oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole
NATの背後にあるサーバーにアクセスしようとしている場合、ほとんどの場合、オプションでサーバーを起動する必要があります。
-Djava.rmi.server.hostname=<public/NAT address>
クライアントに送信されたRMIスタブにサーバーのパブリックアドレスが含まれているため、クライアントは外部からアクセスできます。
終わりの引用が早すぎるということです。最後のパラメーターの後でなければなりません。
このトリックはうまくいきました。
興味深いことに気付きました。次のコマンドラインを使用してアプリケーションを起動すると、
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を使用して同じホストから接続しているときは、実際の物理的なリモートホストからのみこの問題は発生しませんでした。したがって、このチェックは、接続が「外部」から来ている場合にのみ行われると思います。
私にとっては、ホスト名がループバックインターフェイスではなく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
どうもありがとう、次のように動作します:
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
私はこのスレッドがかなり古いことを知っていますが、大いに役立つ追加のオプションがあります。こちらをご覧ください: https://realjenius.com/2012/11/21/Java7-jmx-tunneling-freedom/
-Dcom.Sun.management.jmxremote.rmi.port=1099
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.0.0.0に変更します。