http://www.voidcn.com/article/p-ohrgkkfh-bsv.html

我在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保持相同,另外两个端口更改值。

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连接时不使用一个端口?

补充说明答案

不幸的是,附加的随机端口仍然打开
要提醒你,我使用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

BTW,为什么我在RMI端口之前看不到:: ffff:127.0.0.1?

补充第二次澄清评论

它与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的bug

我成功打开Java的bug:
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8035404与普遍的信念相反,JMX / RMI不需要打开所有这些端口。你实际上可以强制他们相同,这意味着在一天的最后,你只需要在防火墙中打一个洞(如果防火墙是你的问题)。

尝试设置系统属性:

com.sun.management.jmxremote.port
com.sun.management.jmxremote.rmi.port

同样的价值!

明确设置这些将阻止RMI从随机端口中挑选。将它们设置为相同的值将确保它打开较少的端口来监听。

这将在Java 7更新25或更高版本中起作用。

什么是第三个港口?

您的应用程序打开的第三个端口(或第二个端口,如果您遵循上述建议)由Java Attach API使用。它是JConsole用于连接到“本地进程”的。缺省情况下,Java Attach API功能自Java 6启用,而不管com.sun.management.jmxremote属性如何。这个功能将使用随机端口,但这并不重要,因为该功能仅允许来自主机本身的连接。如果您真的不喜欢此功能,那么可以在命令行中添加-XX:DisableAttachMechanism以禁用Java Attach API功能。然后,您将不再看到java进程(在这种情况下是Tomcat)在随机端口上侦听。

如何使JMX仅在Loopback接口上侦听

使用自定义应用程序,您将使用RMIServerSocketFactory,但这是Tomcat,因此您将不得不使用Tomcat的JMX Remote Lifecycle Listener

另一方面,现在没有关系,因为Java 7具有com.sun.management.jmxremote.local.only属性。它确保只允许来自主机本身的连接。请注意,JMX库没有通过绑定到环回接口来实现这一点,这肯定是一种方法,但是由于主机可能具有多个环回接口,所以这一点也不太精确。

事实上,大体上(最近添加了JDK wrt JMX),我会说,Tomcat的JMX远程生命周期监听器现在是多余的,除非你想绑定到一些非常奇怪的网络接口。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注