远程JMX连接


97

我正在尝试打开与远程计算机上运行的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位,两者均无效。



Answers:


118

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

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

您可以通过使用system参数java.rmi.server.hostname="YOUR_IP"(作为环境变量或使用

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

7
不要忘了hostname -i,有关详细信息,请参见stackoverflow.com/a/11654322/99834
索林2012年

工作了!在我们的环境中,我们使用VMWare虚拟机。服务器在VM上。VM被围起来部署,因此它具有内部和外部IP地址。我们使用-Djava.rmi.server.hostname = <external-ip-address>启动了服务器Java进程。
buzz3791 2013年

要设置主机ip或更改localhost ip,此链接将很有用。
Reza Ameri 2014年

我在这里有两个问题-1)如果要使用JMXMP而不是JMX怎么办。那是什么配置?和2)是否可以在不加载RMI协议的情况下建立JMX连接?
库玛·瓦巴哈夫

64

我花了超过一天的时间来尝试使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返回值匹配。

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


添加-Djava.rmi.server.hostname = myserver.example.com可以达到目的!谢谢!
Jim Bethancourt 2014年

我自由地为此打开了一个JDK文档错误:bugs.openjdk.java.net/browse/JDK-8066405
Klara

2
“请确保以下命令返回了真实的IP或HOSTNAME。如果确实返回了127.0.0.1、127.0.1.1或localhost之类的内容,它将无法正常工作,您必须更新/ etc / hosts文件。” 什么?
PedroD

1
很快,不是java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>。希望这对某人有帮助。
桑尼

24

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

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

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



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的数据交换。

因此,这不是网络问题,如果我执行netstat -an(具有或不具有java.rmi.server.hostname系统属性),则具有以下绑定:

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

这意味着在两种情况下,在端口9999上创建的套接字都接受来自任何地址上的任何主机的连接。

我认为此系统属性的内容在连接处使用,并与代理用来与jconsole通信的实际IP地址进行了比较。如果这些地址不匹配,则连接失败。

使用jconsole从同一主机进行连接时,仅从真正的物理远程主机进行连接时,我没有出现此问题。因此,我想仅当连接来自“外部”时才执行此检查。


“您的结尾报价来得太早”是什么意思?我有同样的问题,我看到建立了TCP连接,但是最终jconsole声称它无法连接。
tsuna 2013年

我不知道,如果我没记错的话,某处有一个引号,而该引号不在参数末尾。也许是在批处理脚本中,我不记得了。但是我必须承认这个答案对这个问题没有意义……也许这个问题已经被编辑了?问题下没有经过编辑的通知...我不知道,对不起。
yohann.martineau

6

对我有用的是将/ 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

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



0

我遇到了同样的问题,我将与本地主机名匹配的所有主机名都更改为0.0.0.0,在这样做之后它似乎可以工作。


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

1
你能告诉我为什么会绑定至0.0.0.0,而不是特定的IP
巴布詹姆斯

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.