远程JMX连接

tul*_*ler 91 java jmx jconsole

我正在尝试打开与远程计算机上运行的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位,都不起作用.

小智 111

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

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

您可以通过使用系统参数调用程序来实现此功能java.rmi.server.hostname="YOUR_IP",可以是环境变量,也可以是使用

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记`hostname -i`,详见http://stackoverflow.com/a/11654322/99834. (7认同)

sor*_*rin 60

我花了一天多的时间试图让JMX从localhost外部工作.似乎SUN/Oracle未能就此提供良好的文档.

确保以下命令返回真实的IP或HOSTNAME.如果它确实返回类似127.0.0.1,127.0.1.1或localhost的内容,它将无法工作,您将不得不更新/etc/hosts文件.

hostname -i
Run Code Online (Sandbox Code Playgroud)

这是从外部启用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
Run Code Online (Sandbox Code Playgroud)

您假设的地方,myserver.example.com必须匹配hostname -i返回的内容.

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

  • "确保以下命令返回真实的IP或HOSTNAME.如果它确实返回类似127.0.0.1,127.0.1.1或localhost的内容,它将无法工作,您将不得不更新/ etc/hosts文件." 什么? (2认同)

Les*_*ieM 21

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

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989
Run Code Online (Sandbox Code Playgroud)

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


小智 12

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

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

-Djava.rmi.server.hostname=<public/NAT address>
Run Code Online (Sandbox Code Playgroud)

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


yoh*_*eau 8

它接缝你的结尾报价来得太早了.它应该在最后一个参数之后.

这招对我有用.

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

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用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
Run Code Online (Sandbox Code Playgroud)

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

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

使用jconsole从同一主机连接时,我没有遇到此问题,仅使用真实的物理远程主机.因此,我认为只有当连接来自"外部"时才会进行此检查.


小智 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


Mao*_*dok 5

对我有用的是将/ etc/hosts设置为将主机名指向ip,而不是指向loopback接口,而不是重启我的应用程序.

cat/etc/hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername
Run Code Online (Sandbox Code Playgroud)

这是我的配置:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false
Run Code Online (Sandbox Code Playgroud)