Centos6でJDK7を使用してJavaプログラムを実行します。次のオプションを使用してJMXを有効にします。
Java_OPTS="${Java_OPTS} -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=9123 -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=true"
開いているポートを確認すると、さらに2つのランダムポートが見つかります。
netstat -plunt | grep Java
tcp 0 0 :::9123 :::* LISTEN 13295/Java
tcp 0 0 :::59927 :::* LISTEN 13295/Java
tcp 0 0 :::59928 :::* LISTEN 13295/Java
再起動するたびに設定されたポート9123のみが同じであり、2つの追加ポートが値を変更することに注意してください。
netstat -plunt | grep Java
tcp 0 0 :::9123 :::* LISTEN 13331/Java
tcp 0 0 :::59932 :::* LISTEN 13331/Java
tcp 0 0 :::59933 :::* LISTEN 13331/Java
2つの追加ポートとは何ですか?なぜそれらが開かれますか?
2つの追加のランダムポートを構成するにはどうすればよいですか?
JMXによって開かれたすべてのポートの前に::ffff:127.0.0.1
が表示されるように設定するにはどうすればよいですか?
JConsoleで接続するときに1つのポートが使用されないのはなぜですか?
答えを明確にするために追加
残念ながら、追加のランダムポートはまだ開かれています。念のため、Centos 6を使用しています。Tomcatの設定は次のようになっています(Tomcatはアプリケーションをデプロイしません)。
CATALINA_OPTS="${CATALINA_OPTS} -XX:+DisableAttachMechanism -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.Sun.management.jmxremote.port=9123 -Dcom.Sun.management.jmxremote.rmi.port=9123"
Tomcatプロセスは次のようになります。
/usr/Java/jdk1.7.0_51/bin/Java -Djava.util.logging.config.file=/usr/Tomcat-7.0.47/conf/logging.properties -Djava.util.logging.manager=org.Apache.juli.ClassLoaderLogManager -XX:+DisableAttachMechanism -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.Sun.management.jmxremote.port=9123 -Dcom.Sun.management.jmxremote.rmi.port=9123 -Djava.endorsed.dirs=/usr/Tomcat-7.0.47/endorsed -classpath /usr/Tomcat-7.0.47/bin/bootstrap.jar:/usr/Tomcat-7.0.47/bin/Tomcat-juli.jar -Dcatalina.base=/usr/Tomcat-7.0.47 -Dcatalina.home=/usr/Tomcat-7.0.47 -Djava.io.tmpdir=/usr/Tomcat-7.0.47/temp org.Apache.catalina.startup.Bootstrap start
残念ながら、追加のリスニングポートが表示されるたびに:
tcp 0 0 :::38830 :::* LISTEN 790/Java
tcp 0 0 ::ffff:127.0.0.1:8080 :::* LISTEN 790/Java
tcp 0 0 :::9123 :::* LISTEN 790/Java
追加の実行:
tcp 0 0 ::ffff:127.0.0.1:8080 :::* LISTEN 2348/Java
tcp 0 0 :::36252 :::* LISTEN 2348/Java
tcp 0 0 :::9123 :::* LISTEN 2348/Java
ところで、なぜRMIポートの前に::ffff:127.0.0.1
が表示されないのですか?
コメントを明確にするために2回目の追加
Tomcatとは関係ありません。同様の設定でantを実行しようとしました。Antプロセスは次のようになります。
/usr/bin/Java -XX:+DisableAttachMechanism -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.Sun.management.jmxremote.port=9123 -Dcom.Sun.management.jmxremote.rmi.port=9123 -classpath /usr/Apache-ant-1.9.2/lib/ant-launcher.jar -Dant.home=/usr/Apache-ant-1.9.2 -Dant.library.dir=/usr/Apache-ant-1.9.2/lib org.Apache.tools.ant.launch.Launcher -cp sleep
残念ながら、追加のリスニングポートが表示されるたびに:
tcp 0 0 :::41200 :::* LISTEN 13597/Java
tcp 0 0 :::9123 :::* LISTEN 13597/Java
追加の実行:
tcp 0 0 :::58356 :::* LISTEN 13629/Java
tcp 0 0 :::9123 :::* LISTEN 13629/Java
回答:それはJavaのバグです
Javaでバグを開くことに成功しました: http://bugs.Java.com/bugdatabase/view_bug.do?bug_id=8035404
一般的な考えに反して、JMX/RMIはこれらすべてのポートを開く必要はありません。実際にそれらを同じにすることができます。つまり、1日の終わりに、ファイアウォールに1つの穴を開けるだけで済みます(ファイアウォールが懸念される場合)。
システムプロパティを設定してみてください。
com.Sun.management.jmxremote.port
com.Sun.management.jmxremote.rmi.port
同じ値に!!
これらを明示的に設定すると、RMIはランダムなポートを選択しなくなります。それらを同じ値に設定すると、リッスンするポートが少なくなります。
これは、Java 7 update 25以降で機能します。
アプリケーションによって開かれた3番目のポート(または上記のアドバイスに従った場合は2番目のポート)は、Java Attach APIによって使用されます。 JConsoleが「ローカルプロセス」に接続するために使用するものです。 Java Attach API機能は、com.Sun.management.jmxremote
プロパティに関係なくJava 6以降デフォルトで有効になっています。この機能はランダムなポートを使用しますが、この機能はホスト自体からの接続のみを許可するため、実際には問題ではありません。この機能が本当に嫌いな場合は、-XX:+DisableAttachMechanism
をコマンドラインに追加して、Java Attach API機能を無効にすることができます。その後、ランダムポートでリッスンするJavaプロセス(この場合はTomcat)が表示されなくなります。
カスタムメイドのアプリケーションでは RMIServerSocketFactory を使用しますが、これはTomcatであるため、Tomcatの JMX Remote Lifecycle Listener を使用して実行する必要があります。
一方、Java 7以降はcom.Sun.management.jmxremote.local.only
プロパティを持っていることは重要ではありません。ホスト自体からの接続のみが許可されるようにします。 JMXライブラリはループバックインターフェースにバインドすることでこれを達成しないことに注意してください。これは確実にone方法ですが、ホストには潜在的にいくつかのループバックインターフェースがあるため、わずかに不正確です。
実際、全般的に(JDK wrt JMXに最近追加された)、TomcatのJMX Remote Lifecycle Listenerは、本当に奇妙なものにバインドしたい場合を除いて冗長になりましたネットワークインターフェース。
Oracleの使用Java SE 1.8.0_121。
Jmxremote.portとjmxremote.rmi.portを同じ値に設定することができます。1つ少ないポートが開かれます。また、jmxremote.Host = 127.0.0.1を設定して、そのポート(または、それらを別々に設定した場合はこれらの2つのポート)をループバックインターフェイスのみにバインドすることもできます。
ただし、別のポートはまだ動的に割り当てられており、0.0.0.0にバインドされます。 -XX + DisableAttachMechanismを使用してこのポートを防ぐことはできませんでした。また、0.0.0.0以外のものにバインドすることもできませんでした。
Jmxはrmiにカプセル化されているため、非常にファイアウォールであり、NATには不向きです。可能な場合は避けてください。jmxmpと呼ばれる代替のカプセル化があります。
あなたを助けるかもしれないを見てください: http://blog.markfeeney.com/2010/10/jmx-through-ssh-tunnel.htmlhttp:// jrds。 fr/sourcetype/jmx/start#jmx_protocols