過去にこれを機能させることはなかったようです。現在、私はそれが動作しないことを知っています。
ただし、Javaプロセスを開始します。
-Dcom.Sun.management.jmxremote
-Dcom.Sun.management.jmxremote.port=6002
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
ポートにtelnetで接続し、「何かがそこにある」(つまり、プロセスを開始しない場合、何も応答しませんが、開始する場合は応答します)が、JConsoleにIPを埋めさせることはできません。およびポート。
とてもシンプルなはずですが、エラーもノイズも何もありません。うまくいきません。
誰でもこれのホットチップを知っていますか?
これには解決策があります:
Javaプロセスがファイアウォールの背後のLinuxで実行されている場合、開始する場合JConsole/Java VisualVM/Javaローカルマシン上のWindowsのMission ControlをJavaプロセスのJMXポートに接続します。
SSHログイン経由でLinuxマシンにアクセスする必要があります。すべての通信は、SSH接続を介してトンネリングされます。
TIP:このソリューションは、ファイアウォールの有無に関係なく機能します。
欠点:Javaプロセスをrestartするたびに、4から9までのすべてのステップを実行する必要があります。再び。
http://www.chiark.greenend.org.uk/~sgtatham/PuTTY/download.html
少なくともPuTTY.exe
<jmx-remote-port>
jmx-remote-port = 15666
これは、このように正確に行う必要があります。以下のように実行すると、ファイアウォールの背後にあるLinuxマシンで動作します(-Djava.rmi.server.hostname=localhost
引数の原因で動作します)。
-Dcom.Sun.management.jmxremote
-Dcom.Sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
Java -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=15666 -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main
ps -ef | grep <Java-processname>
result ---> <process-id>
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
Javaプロセスは、Linuxマシンで新しいTCPポートを開きます。このポートでは、RMIサーバースタブをダウンロードできます。このポートは、Java仮想マシンへの接続を取得するために、SSHトンネルを介して使用可能にする必要もあります。
netstat -lp
を使用すると、このポートを見つけることもできます。lsof -i
は、Javaプロセスから開いたポートのヒントを提供します。
注:このポートは、Javaプロセスの開始時に常に変更されます。
netstat -lp | grep <process-id>
tcp 0 0 *:<jmx-remote-port> *:* LISTEN 24321/Java
tcp 0 0 *:<rmi-server-port> *:* LISTEN 24321/Java
result ---> <rmi-server-port>
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/Java
tcp 0 0 *:37123 *:* LISTEN 24321/Java
result ---> 37123
Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local
[x] Auto
Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local
[x] Auto
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
PuTTYセッションを開いたままにします。
ログインすると、PuTTYはすべてのTCP接続をSSHポート22経由でLinuxマシンにトンネリングします。
JMXポート:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
これは機能します。JConsole/ Java VisualVM/Java Mission Controlは、ローカルWindowsマシンのポートに接続しているとみなします。しかし、PuTTYはすべてのペイロードをLinuxマシンのポート15666に送信します。
Linuxマシンでは、最初にJavaプロセスが応答し、RMIServerポートを送り返します。この例では37123。
次に、JConsole/Java VisualVM/Java Mission Controlは、localhost:37123に接続すると判断し、PuTTYはペイロード全体をLinuxマシンに転送します
Javaプロセスが応答し、接続が開かれます。
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
-Djava.rmi.server.hostname='<Host ip>'
を追加すると、この問題は解決しました。
このソリューションはファイアウォールでもうまく機能します
-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
Windowsユーザー:
PuTTY.exe -ssh user@remote-Host -L 1616:remote-Host:1616
LinuxおよびMacユーザー:
ssh user@remote-Host -L 1616:remote-Host:1616
jconsole
を起動しますjconsole localhost:1616
追伸:ステップ2では、ssh
および-L
を使用して、ローカル(クライアント)ホストのポート1616をリモート側に転送する必要があることを指定します。これはsshトンネルであり、ファイアウォールやさまざまなネットワークの問題を回避するのに役立ちます。
おそらくファイアウォールで問題が発生しています。 「問題」は、指定したポートが使用される唯一のポートではなく、RMIに1つまたは2つ以上のポートを使用することであり、これらはおそらくファイアウォールによってブロックされます。
デフォルトのRMI構成を使用すると、余分なポートの1つが事前に認識されないため、ポートの広い範囲を開く必要があります-サーバー管理者を楽しませない場合があります。
多くのポートを開く必要のないソリューションがありますが、私はそれを組み合わせたソーススニペットとヒントを使用して動作するようになりました
http://forums.Sun.com/thread.jspa?threadID=5267091 -リンクはもう機能しません
http://blogs.Oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx
http://Java.Sun.com/javase/6/docs/technotes/guides/management/agent.html
Sshトンネルを設定して、それを動作させることさえ可能です:-)
過去数日間Google-fuをテストした後、Stack Overflowとこのページからの回答をコンパイルした後、ようやくこれを機能させることができました http://help.boomi.com/atomsphere/ GUID-F787998C-53C8-4662-AA06-8B1D32F9D55B.html 。
Dell Boomiページからの再投稿:
To Enable Remote JMX on an Atom
If you want to monitor the status of an Atom, you need to turn on Remote JMX (Java Management Extensions) for the Atom.
Use a text editor to open the <atom_installation_directory>\bin\atom.vmoptions file.
Add the following lines to the file:
-Dcom.Sun.management.jmxremote.port=5002
-Dcom.Sun.management.jmxremote.rmi.port=5002
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
スタックオーバーフローの回答カバーを見たことがない1行は、
-Dcom.Sun.management.jmxremote.rmi.port=5002
私の場合、Kakfaメトリックを取得しようとしていたので、-Dcom.Sun.management.jmxremote.port
値に一致するように上記のオプションを変更しただけです。したがって、いかなる種類の認証もなしで、最低限の構成は次のようになります。
-Dcom.Sun.management.jmxremote
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.port=(jmx remote port)
-Dcom.Sun.management.jmxremote.local.only=false
-Dcom.Sun.management.jmxremote.rmi.port=(jmx remote port)
-Djava.rmi.server.hostname=(CNAME|IP Address)
Linuxで実行していますか?おそらく、管理エージェントはlocalhostにバインドしています。
http://Java.Sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1
Sushicuttaの手順4〜7は、手順3に次の行を追加することでスキップできます。
-Dcom.Sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>
例えば起動パラメーターに追加:
-Dcom.Sun.management.jmxremote
-Dcom.Sun.management.jmxremote.port=12345
-Dcom.Sun.management.jmxremote.rmi.port=12345
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
ポート転送の場合、次を使用して接続します。
ssh -L 12345:localhost:12345 <username>@<Host>
ホストが飛び石の場合は、上記の後、飛び石で次のコマンドを実行してポートを前方にチェーンするだけです。
ssh -L 12345:localhost:12345 <username>@<Host2>
Jmxremoteがrmi接続にトンネルを使用するように指示していることを確認するには、hostname = localhostが必要であることに注意してください。そうしないと、直接接続してファイアウォールに到達しようとする場合があります。
プロト:
RMIポートは任意のportnrで開かれます。ファイアウォールがあり、ポート1024〜65535を開きたくない場合(またはvpnを使用したくない場合)は、次の手順を実行する必要があります。
RMIレジストリとJMX/RMIサーバーのポートを修正する必要があります(既知の番号を持っている場合など)。これを行うには、jarファイル(catalina-jmx-remote.jarはエクストラにあります)をlib-dirに配置し、サーバーの下に特別なリスナーを設定します。
<Listener className="org.Apache.catalina.mbeans.JmxRemoteLifecycleListener"
rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
(もちろん、JMXをアクティブにするための通常のフラグ
-Dcom.Sun.management.jmxremote \
-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
次に、この恐ろしいURLを使用して接続できます。
service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi
サーバーがファイアウォールの内側にあるかどうかを確認してください。 JMXはRMIに基づいており、起動時に2つのポートを開きます。 1つはレジスタポートで、デフォルトは1099で、com.Sun.management.jmxremote.port
オプションで指定できます。もう1つはデータ通信用で、ランダムです。これが問題の原因です。良いニュースは、JDK6から、このランダムなポートはcom.Sun.management.jmxremote.rmi.port
オプションで指定できることです。
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"
ファイアウォールを介してJMXを取得するのは非常に困難です。問題は、標準のRMIが2つ目のランダムに割り当てられたポート(RMIレジストリの横)を使用することです。
動作する3つのソリューションがありますが、すべてのケースで異なるものが必要です。
JMX over SSH Tunnel with Socksプロキシ、SSHマジックで標準RMIを使用 http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html
JMX MP(標準RMIの代替)、1つの固定ポートのみを使用しますが、サーバーとクライアントに特別なjarが必要です http://meteatamel.wordpress.com/2012/02/13/ jmx-rmi-vs-jmxmp /
JMXサーバーのフォームコードを起動すると、標準のRMIを使用し、固定の2番目のポートを使用できます。 https://issues.Apache.org/bugzilla/show_bug.cgi?id=39055
次は私のために働いた(ポート2101は実際にこれに貢献しなかったと思うが):
-Dcom.Sun.management.jmxremote.port=2100
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.local.only=false
-Dcom.Sun.management.jmxremote.rmi.port=2101
-Djava.rmi.server.hostname=<IP_ADDRESS>OR<HOSTNAME>
リモートマシンからDockerを実行しているサーバーに接続しており、プロセスはコンテナー内にあります。また、firewallDを停止しましたが、ファイアウォールが開いていても2100にtelnetで接続できるので、それが問題だとは思いません。それが役に立てば幸い。
リモート JMXの問題をテスト/デバッグ/診断するときは、最初に常に、MBeanServer(つまりlocalhost)を含む同じホストに接続して、ネットワークやその他の非JMX固有の問題を除外してください。
ここにはすでにいくつかの素晴らしい答えがありますが、共有する価値があると思う、少し単純なアプローチがあります。
sushicuttaのアプローチは優れていますが、毎回RMIポートを取得する必要があるため、非常に手作業です。ありがたいことに、ポートトンネルを明示的に開くのではなく、SOCKSプロキシを使用することで、この問題を回避できます。このアプローチの欠点は、マシンで実行するJMXアプリがプロキシを使用するように設定できる必要があることです。ほとんどのプロセスでは、Javaプロパティを追加することでこれを実行できますが、一部のアプリはこれをサポートしていません。
手順:
リモートJavaサービスの起動スクリプトにJMXオプションを追加します。
-Dcom.Sun.management.jmxremote=true
-Dcom.Sun.management.jmxremote.port=8090
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.authenticate=false
リモートマシンへのSOCKSプロキシ接続をセットアップします。
ssh -D 9696 [email protected]
SOCKSプロキシ(localhost:9696)を使用するようにローカルJava監視アプリを構成します。注:コマンドラインから時々を実行できます。
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9696
Boot2dockerを使用してTomcatを内部に持つdockerコンテナーを実行していますが、同じ問題が発生しました。解決策は次のとおりです。
-Djava.rmi.server.hostname=192.168.59.103
を追加docker run ... -p 9999:9999 ...
)。別のポートを使用しても機能しません。Linux Redhat ES3を実行しているTomcatにフックしているウィンドウでJConsole/JVisualVmを実行しています。
次のコマンドを使用してパケットフィルタリングを無効にすると、私にとってはうまくいきませんでした。
/usr/sbin/iptables -I INPUT -s jconsole-Host -p tcp --destination-port jmxremote-port -j ACCEPT
ここで、jconsole-Hostは、JConsoleが実行されるホスト名またはホストアドレスであり、jmxremote-portは、リモート管理用にcom.Sun.management.jmxremote.portに設定されたポート番号です。
ファイアウォールを介してJMXを取得することは、それほど難しくありません。小さなキャッチが1つあります。 JMXで構成されたポートの両方を転送する必要があります。 9010および動的ポートの1つが、私のマシンでリッスンしている> 30000
また、マシン名がJMXがバインドしているIPに解決されることを確認する必要があります。 localhostまたは127.0.0.1ではありません。私にとっては、これを明示的に定義するホストにエントリを追加するのに役立ちました。
JMCを実行するグラフィカル環境を提供しないリモートサーバーでNiFiのプロファイルを作成するために、JMCでフライトレコーダー(JFR)を実行しようとしています。
ここで与えられた他の回答と、多くの試行錯誤に基づいて、NiFiを起動するときにJVMに提供するものを以下に示します(conf/bootstrap.conf)。
Java.arg.90=-Dcom.Sun.management.jmxremote=true
Java.arg.91=-Dcom.Sun.management.jmxremote.port=9098
Java.arg.92=-Dcom.Sun.management.jmxremote.rmi.port=9098
Java.arg.93=-Dcom.Sun.management.jmxremote.authenticate=false
Java.arg.94=-Dcom.Sun.management.jmxremote.ssl=false
Java.arg.95=-Dcom.Sun.management.jmxremote.local.only=false
Java.arg.96=-Djava.rmi.server.hostname=10.10.10.92 (the IP address of my server running NiFi)
私はこれを/ etc/hostsに入れましたが、必要だとは思いませんが:
10.10.10.92 localhost
次に、JMCの起動時に、次のプロパティを使用してリモート接続を作成します。
Host: 10.10.10.92
Port: 9098
User: (nothing)
Password: (ibid)
ちなみに、カスタムJMXサービスURLをクリックすると、次のように表示されます。
service:jmx:rmi:///jndi/rmi://10.10.10.92:9098/jmxrmi
これは最終的に私のためにそれをしました。
これらは私のために働いた手順です(サーバー側のファイアウォールの背後にあるdebian、私のローカルMacからVPN経由で到達しました):
サーバーのIPを確認
hostname -i
jVMパラメーターを使用します。
-Dcom.Sun.management.jmxremote
-Dcom.Sun.management.jmxremote.port=[jmx port]
-Dcom.Sun.management.jmxremote.local.only=false
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=[server ip from step 1]
アプリケーションを実行する
実行中のJavaプロセスのpidを見つける
jMX/RMIが使用するすべてのポートを確認します
netstat -lp | grep [pid from step 4]
ファイアウォールのステップ5からのすべてのポートを開きます
出来上がり。
貢献するために、これがTomcat 6のCentOS 6.4で行ったことです。
Iptablesサービスのシャットダウン
service iptables stop
Tomcat6.confに次の行を追加します
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=8085 -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=[Host_ip]"
このようにして、JConsoleを使用して別のPCから接続できました。