【问题标题】:JMX : cant connect from Windows box to monitor JMX port on a Linux systemJMX:无法从 Windows 机器连接以监控 Linux 系统上的 JMX 端口
【发布时间】:2011-07-19 23:41:46
【问题描述】:

我在 JDK1.6 中使用 jconsole.exe 和 JVisualVM.exe 有很多经验,并且已经通过 JMX.remote 从 Windows JVM 连接到另一台机器上的 Windows JVM 数千次,但是当我失败时它失败了尝试监控在 Linux 主机上运行的 java 实例(从 Windows 主机,我在 Redhat 和 Amazon EC2 的 SUSE 上尝试了 JMX 侦听器)。我也尝试使用 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>

this link 找到了一个类似的问题,但它没有回答我的问题。

我确认“iptables”未作为服务启用且未启用,因此我不认为存在任何形式的防火墙阻塞。此外,windows 和 linux 机器都在一个 10.0.0.0 私有内部子网上。我可以 telnet 到 8001 端口来验证它的存在,以及它在 linux 机器上的监听(netstat -ap)。

【问题讨论】:

    标签: java jmx remote-debugging


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      实际上我自己刚刚解决了这个问题并想通了。

      我敢打赌,问题在于 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 并在首选项中的“网络”下将其配置为在 localhost 的端口 9999 上使用 socks 代理。

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

      祝你好运:-)

      【讨论】:

        【解决方案3】:

        我认为您的问题是 RMI 实现很难通过防火墙使用,例如它需要的端口数量超过了您指定的工作端口。如果您连接到自己的机器或同一网络上的机器,您通常不会注意到的事情。 This post describes the problems you will run into quite well

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

        如果你在谷歌上搜索 jmxmp,你会发现很多关于如何设置的例子,我的第一个点击是http://pub.admc.com/howtos/jmx/distributed-chapt.html#jmxmp-sect,它可能有点过于面向代码,但我还是在这里添加它,因为它解释了事情像大多数人一样用 jmxmp 写几句好句子。

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

        试一试,如果遇到问题,可以提出更具体的问题。

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

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

        【讨论】:

        • 我确认没有端口阻塞(正如我在上面的编辑中所说),但我会查看您的建议并尽快回复您。
        • 问题是仅仅验证你没有阻塞指定的端口是不够的。还有更多(如第一个链接中所述)。无论如何,有可能让它工作,但 jmxmp 更容易使用,并且(恕我直言)在距离上工作得更好。
        • 我找不到任何关于“-D”参数应该是什么的文档,对于 JVM,让 JMXMP 侦听器运行。或者,除非我在代码中实现它,否则它不起作用,例如 Jetty 通过他们的配置文件在代码中实现它的方式?
        • @djangofan 我认为没有任何 -D 参数,因为它是可选的附加组件,并且 JVM 默认不知道如何处理它。如果您正在运行码头、tomcat 等,只需添加正确的服务 URL 即可。如果您自己编写了服务器,则可能还需要在代码中创建侦听器(即使对于 RMI 侦听器,我也建议这样做,但那是另一回事了)。编辑:更新帖子以向您展示如何。
        • 谢谢。这看起来像是要走的路。我可能需要一周左右的时间来解决这个问题,但谢谢。稍后我会奖励积分。
        【解决方案4】:

        您是否尝试过从您的 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 是远程 Linux 机器上侦听 JMX 命令的端口。

        通过以上任一方法,您可以在 Windows 机器上使用 jconsole 或 visualvm 并连接到 localhost:7777

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

        【讨论】:

        • 我正在使用 Bitwise Tunnelier SSH 客户端来设置客户端到服务器的端口转发。仍然无法让它工作,但我会再摆弄它,因为它看起来很有希望......
        • 要确认您的端口转发技术是否有效,只需尝试将它与远程服务器上您知道有效的某个端口一起使用。就像在端口 80 上运行的 Apache 实例,您可以从该框的命令访问它使用curl http://localhost 的行。一旦您知道该端口有效,请尝试从您的 Windows 框中设置一个隧道/端口转发,并查看您是否能够访问它。这样,您就知道端口转发对您有用,并且可以将问题的范围限制在 JMX 服务器上。
        猜你喜欢
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多