繁体   English   中英

JMX:无法从Windows框连接到Linux系统上的JMX端口

[英]JMX : cant connect from Windows box to monitor JMX port on a Linux system

我在JDK1.6中有jconsole.exe和JVisualVM.exe的很多经验,并且已经通过JMX.remote从Windows JVM连接到另一台机器上的Windows JVM数千次,但是当我尝试监视时它失败了一个在Linux主机上运行的java实例(来自Windows主机,我在redhat上尝试了JMX监听器,在Amazon EC2上尝试了SUSE)。 我也尝试使用jconsole.exe并得到类似的错误。

是否有任何人可以想到的原因,为什么这种JMX连接会有问题。 我可以尝试任何想法吗? 有没有人“实际”做到这一点,可以说如果我坚持下去会有效吗?

我从JVisualVM获得的错误(在远程连接尝试中)是这样的:

"Cannot connect using service:jmx:rmi:///jndi/rmi://<jmx service ip>:8001/jmxrmi"

我的远程JMX服务配置是这样的:

 -Dcom.sun.management.jmxremote
 -Dcom.sun.management.jmxremote.port=8001
 -Dcom.sun.management.jmxremote.authenticate=false
 -Dcom.sun.management.jmxremote.hostname=<jmx service ip>

此链接中发现了类似的问题,但它没有回答我的问题。

我确认“iptables”没有作为服务启用而且没有打开,所以我没有成像,有任何类型的防火墙阻塞。 此外,Windows和Linux机器都在10.0.0.0私有内部子网上。 我能够telnet到端口8001来验证它的存在,并在linux机器上监听它(netstat -ap)。

请参阅系统属性java.rmi.server.hostname 在Linux服务器JVM上,将此系统属性设置为主机的公共IP。 然后在您的客户端JMX URL中使用公共IP。

我认为您的问题是RMI实现很难通过防火墙来处理,例如它需要的不仅仅是您指定的端口才能工作。 如果您连接到自己的计算机或同一网络上的计算机,通常不会注意到的事情。 这篇文章描述了你将遇到的问题

如果我是你,我会尝试将jmxmp设置为替代协议。 为此,您需要添加jmxremote_optional.jar(从Oracle免费下载, 从此处下载“JMX Remote API 1.0.1_04参考实现” )到服务器和jvisualvm类路径,但这是值得的。

如果你google for jmxmp你会发现很多关于如何设置的例子,我的第一个点击是http://pub.admc.com/howtos/jmx/distributed-chapt.html#jmxmp-sect有点过于面向代码,但无论如何我都在这里添加它,因为它解释了像jmxmp这样的东西,在一些好的句子中。

如何定义服务器端端点取决于您正在运行的内容。 大多数应用服务器都允许您输入启用jmxmp的jmx服务URL,但如果服务器是从头开始编写的,您可能需要自己在代码中设置它,而不是使用-D开关到您习惯的java。

如果您遇到问题,请尝试并返回更具体的问题。

编辑:将jar添加到类路径后,您在代码中必须做的唯一事情(假设您没有使用已经为您处理它的服务器应用程序)如下(省略声明,异常处理等等)无论如何你会弄清楚):

url=new JMXServiceURL(jmxurl);
this.server = JMXConnectorServerFactory.newJMXConnectorServer(url, null, ManagementFactory.getPlatformMBeanServer());
this.server.start();

您是否尝试过从Windows机器创建到Linux机箱的SSH隧道? http://oldsite.precedence.co.uk/nc/putty.html

或者如果您有cygwin,只需尝试ssh -f your-user@remote-server.com -L 7777:remote-server.com:123 -N其中7777是您的Windows机器上的端口, 123是该端口上的端口侦听JMX命令的远程Linux框。

使用上述任一方法,您可以在Windows框中使用jconsole或visualvm并连接到localhost:7777

我知道iptables已被禁用,但只需通过SSH连接到Linux框并尝试使用jconsole的命令行JMX模式(在Linux机器上)来确认JMX在该端口上正常工作。

我实际上只是自己解决了这个问题并弄明白了。

我打赌问题是RMI连接 - 你无法预测它将使用哪些端口,所以你不能让它与防火墙一起工作。

解决方法是使用SSH代理:

  1. SSH到运行应用程序的框但是使用-D选项,如下所示:

    ssh user @ remoteHost -D 9999

    当你在Windows上时,你可以使用Cygwin来运行上面的命令,或者你也可以通过GUI对Putty做同样的事情(指南: http//blog.ashurex.com/2012/03/15/creating- ssh-proxy-tunnel-putty /

    这将在端口9999上的本地计算机上启动socks代理。

  2. 打开JVisualVM,在首选项中,在“network”下将其配置为在localhost上使用socks代理,在端口9999上。

如果您执行上述操作,则应该能够正常连接到远程计算机,并且因为所有RMI流量现在都通过SSH代理,所以它通过防火墙打孔并且运行良好。

祝好运 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM