103

我正在尝试打开与远程机器上运行的 java 应用程序的 JMX 连接。

应用程序 JVM 配置有以下选项:

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port=1088
  • com.sun.management.jmxremote.authenticate=false
  • com.sun.management.jmxremote.ssl=false

我可以localhost:1088使用 jconsole 或 jvisualvm 进行连接。但我无法使用xxx.xxx.xxx.xxx:1088远程机器进行连接。

服务器之间或操作系统上没有防火墙。但是为了消除这种可能性telnet xxx.xxx.xxx.xxx 1088,我认为它是连接的,因为控制台屏幕变成空白。

两台服务器都是 Windows Server 2008 x64。尝试使用 64 位 JVM 和 32 位,均无效。

4

12 回答 12

123

如果它在 Linux 上,问题将是localhost 是环回接口,您需要应用程序绑定到您的网络接口

您可以使用 netstat 确认它没有绑定到预期的网络接口。

您可以通过使用系统参数调用程序来完成这项工作java.rmi.server.hostname="YOUR_IP",无论是作为环境变量还是使用

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
于 2009-05-07T13:31:17.163 回答
69

我花了一天多的时间试图让 JMX 在本地主机之外工作。似乎 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返回的内容匹配。

显然,您需要确保防火墙不会阻止您,但我几乎可以肯定这不是您的问题,问题是未记录的最后一个参数。

于 2012-07-25T16:24:48.217 回答
27

在我对 Tomcat 和 Java 8 的测试中,除了为 JMX 指定的端口之外,JVM 还打开了一个临时端口。以下代码修复了我;如果您的 JMX 客户端出现问题(例如VisualVM未连接),请尝试一下。

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

另请参阅配置 JMX 时为什么 Java 会打开 3 个端口?

于 2016-10-05T18:14:04.857 回答
12

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

如果您尝试访问位于 NAT 后面的服务器 - 您很可能必须使用该选项启动服务器

-Djava.rmi.server.hostname=<public/NAT address>

这样发送到客户端的 RMI 存根包含服务器的公共地址,允许客户端从外部访问它。

于 2011-09-08T21:04:18.133 回答
8

看起来你的结束语来得太早了。它应该在最后一个参数之后。

这个技巧对我有用。

我注意到一些有趣的事情:当我使用以下命令行启动我的应用程序时:

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

如果我尝试使用 jconsole 从远程计算机连接到此端口,则 TCP 连接成功,在远程 jconsole 和部署了我的 MBean 的本地 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 从同一主机连接时,我没有遇到此问题,仅从真正的物理远程主机连接。所以,我认为只有当连接来自“外部”时才进行此检查。

于 2010-06-18T10:27:36.083 回答
7

对我有用的是设置 /etc/hosts 将主机名指向 ip 而不是环回接口,然后重新启动我的应用程序。

猫 /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
于 2014-12-02T09:01:22.047 回答
5

非常感谢,它的工作原理是这样的:

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

于 2014-03-11T14:42:49.873 回答
2

我知道这个线程已经很老了,但是还有一个额外的选项会很有帮助。见这里:https ://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/

-Dcom.sun.management.jmxremote.rmi.port=1099

于 2018-09-18T18:12:38.320 回答
0

我有同样的问题,我将任何与本地主机名匹配的主机名更改为 0.0.0.0,在我这样做之后它似乎工作。

于 2012-05-10T20:13:53.253 回答
0

要启用 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
于 2017-12-04T08:36:24.260 回答
0

试试这个,我测试了在 docker 容器中访问 JMX

-Dcom.sun.management.jmxremote=true -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.port=16000 -Dcom.sun.management.jmxremote.rmi.port=16000 -Dcom.sun .management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

然后

$ jconsole 本地主机:16000

于 2020-05-29T00:14:51.030 回答
-12

尝试使用高于 3000 的端口。

于 2009-05-07T13:25:21.500 回答