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"
同じではないにしても、似たような問題がありました。マシンでローカルにjconsoleを起動した場合、JMXサーバーに接続できました。
RMIサーバーが正しいIPでリッスンしていないようです。 この関連する質問 で提案されたように、私は次を追加しました:
-Djava.rmi.server.hostname=<Host ip>
Java_OPTS
同様に、そしてそれは働いた。
私は、他のメンバーからのヒントを見つけて、ネット上に広がる情報を収集しました。
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)への接続を確立します。
ワークステーションとサーバーの間にファイアウォールがもうない場合は、動作するはずです。
-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 "
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
ssh
と-L
を使用して、ローカル(クライアント)ホストのポート1616をリモート側に転送することを指定します。jMX接続URLとして使用している文字列。明らかなことを指摘するつもりはありませんが、JConsoleにはひどいインターフェイスがあり、リモートjmxアプリに接続する前に非常に複雑なURLが必要です。私のものは次のようになります。
service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi
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
「しかし、正常に接続できません」と言うとき、正確にはどういう意味ですか?エラーメッセージはありますか? 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
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
それが役に立てば幸い
サーバーがファイアウォールの内側にあるかどうかを確認してください。 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"
このすべての調査を完了するために、私はあなたのすべてのために何かを得ました。トリックがあります。プロファイラーツールはポートを使用してjvmと接続しますが、jvmは別のランダムポートを使用して会話を続行します。 jvmがリモートマシン(たとえば、Tomcat web-appサーバー)内で実行されており、リモートマシンが発信および着信接続に対して保護されている場合、Javaシステムプロパティcom.Sun.management.jmxremote.rmi.port
com.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/
みんなに貢献したい!
そして成功を祈る!
さて、Linuxボックス(仮想マシン)でこの問題が発生し、-Djava.rmi.server.hostnameプロパティを使用して修正しましたが、理解できないことがあります。私のマシンには5つのTomcatサーバーがあり、すべてのサーバーで連続ポート(8008、8018、8028 ...)でjmxが有効になっており、JMXの接続でこの問題が発生したのはそのうちの1つだけでした。ファイアウォールなし、Tomcatに-Djava.rmi.server.hostnameプロパティなし...
そのため、問題は理解できますが、Tomcatのうち4つが機能し、1つが機能しなかった理由を理解できません。
P.D:私の英語はとても下手です。謝罪いたします。
Linuxで/etc/hosts
を変更して、アカウントに関連付けられたローカルホストアドレスをマシンのIPに置き換えたので、この問題は解決しました。
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