仍然无法通过 VisualVM 远程连接 Tomcat 6

Posted

技术标签:

【中文标题】仍然无法通过 VisualVM 远程连接 Tomcat 6【英文标题】:Still cannot connect Tomcat 6 remotely via VisualVM 【发布时间】:2010-02-19 10:00:04 【问题描述】:

如果检查了有关此问题的其他问题,但到目前为止还没有灵魂。 这是我的设置: TC6 在我的 macbook 上的 debian vm 上运行。在 /etc/default/tomcat6.0 我设置了以下选项:

CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

netstat -ntlp 给我:

tcp6       0      0 :::8080                 :::*                    LISTEN      6550/java
tcp6       0      0 :::8086                 :::*                    LISTEN      6550/java

其中 6550:

root      6550  3.3  6.8 224888 52984 pts/0    Sl   10:31   0:43 /usr/lib/jvm/java-6-sun/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/var/lib/tomcat6.0/conf/logging.properties -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.endorsed.dirs=/usr/share/tomcat6.0/common/endorsed -classpath :/usr/lib/jvm/java-6-sun/jre//lib/jcert.jar:/usr/lib/jvm/java-6-sun/jre//lib/jnet.jar:/usr/lib/jvm/java-6-sun/jre//lib/jsse.jar:/usr/share/tomcat6.0/bin/bootstrap.jar:/usr/share/tomcat6.0/bin/commons-logging-api.jar -Dcatalina.base=/var/lib/tomcat6.0 -Dcatalina.home=/usr/share/tomcat6.0 -Djava.io.tmpdir=/var/lib/tomcat6.0/temp org.apache.catalina.startup.Bootstrap start

防火墙:

Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all      anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all      anywhere             anywhere 

当我尝试使用 jvisualm 从 OSX 连接时: - 使用我的 vm 的主机名添加一个新主机(将其添加到 /etc/hosts) - 添加新的 JMX 连接

VisualVM 失败:

Cannot connect using service:jmx:rmi///jndi/rmi://<vmhostname>:8086/jmxrmi

当我使用ssh -X 连接到我的 VM 并在运行 tomcat 的同一台机器上启动 jvisualvm 时,我最初看不到 TC,但我可以像上面一样添加 jmx 连接。

这可能是外国主机被诡异地阻止访问 rmiregistry 的问题吗? 为什么会有人做这种蠢事?

我做错了什么?

(抱歉 4 帖子太长了)

【问题讨论】:

RMI 也会打开其他动态端口(默认 JMX 连接使用 RMI)。这使得隧道和正确配置防火墙变得很痛苦。基本上,它从未被设计为在一个广泛开放的网络之外的任何地方运行。由于我无法提供任何具体细节,所以我只写了这篇评论。 谢谢约阿希姆。实际上,防火墙的东西让我感到困惑。由于它在我的本地计算机上的 VM 上运行,因此我完全禁用了防火墙,请参见上文(全部接受)。您声明,使用 rmi 是默认设置。您还有其他想法如何使用 visualvm 监控远程 tomcat 吗? 谢谢@JoachimSauer 解决了我的问题 【参考方案1】:

这是how to connect Visual VM to Tomcat 7 的教程。它有点冗长,但应该可以帮助您解决大多数人遇到的一些问题。

【讨论】:

+1,这对我有用。原始问题的配置和对我有用的配置之间的区别是这个标志:-Djava.rmi.server.hostname=50.112.22.47"【参考方案2】:

查看此页面上的 jmx 侦听器。 http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

它允许您设置 JMX 端口和 RMI 注册表端口,这两个端口都必须在您的防火墙上打开。

【讨论】:

这几乎解决了我的问题,伟大而简短的帖子 - 小心检查 RMI 主机名,在许多服务器上,外部 ip 自己不知道,因此 RMI 只绑定到某个本地地址。跨度> 【参考方案3】:

尝试添加到 catalina_opts:-Djava.rmi.server.hostname=vmhostname 并确保您的 Mac 能够解析此主机名,例如 nc -v vmhostname 8086 应该会成功打开连接。

【讨论】:

【参考方案4】:

您可以尝试将实际 ip 和主机名添加到运行 jstatd 的 /etc/hosts 中。

【讨论】:

【参考方案5】:

按照这些步骤,

从Download Jvisualvm下载jvisualvm设置

解压此设置并从命令行转到 bin 目录

使用这个命令来启动visualvm:

\bin>visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9998 -J-Djava.net.useSystemProxies=true

获取putty设置,进入putty安装目录,使用以下命令ssh隧道到远程系统

putty -D 9998 -load Name_of_the_saved_putty_session

saved_putty_session 应该有到 localhost:JMX_port 和 some_source_port 的隧道

现在在左导航的visualvm UI中,右键单击远程并“添加远程主机”,远程主机的公共IP

现在在这个添加的远程主机上右键单击并说“ADD JMX CONNECTION”

在连接框中说 localhost:source_port_provided_in_putty_tunnel

点击确定按钮就完成了。

【讨论】:

【参考方案6】:

所以以上对我有用:

service:jmx:rmi:///jndi/rmi://machinedomainname:1099/jmxrmi

在此花费 1/2 天后。遵循所有通常的说明并感到沮丧,上面破解了它。

我在亚马逊 ec2 中部署了一个播放应用程序,带有以下标志:

 -Dcom.sun.management.jmxremote
   -Dcom.sun.management.jmxremote.port=<myport>
   -Dcom.sun.management.jmxremote.authenticate=false
   -Dcom.sun.management.jmxremote.ssl=false
   -Dcom.sun.management.jmxremote.local.only=false
   -Djava.rmi.server.hostname=<mymachinedomainname>

我有 jvisualvm 在我的 Mac 上本地运行。

我添加了一个 jvisualvm 远程主机,主机名:

 <mymachinedomainname>

然后添加了到此主机的 jmx 连接。 我试过推荐的

service:jmx:rmi://<mymachinedomainname>:<myport>

但它只是无法连接。

但我一开始就这样做了

service:jmx:rmi:///jndi/rmi://<mymachinedomainname>:<myport>/jmxrmi 

相反。它连接并工作。

不知道为什么!但它有效。

【讨论】:

【参考方案7】:

确保你可以

a) ping <vmhostname>
b) telnet <vmhostname> 8086

另请注意,您可以使用 IP 地址代替 &lt;vmhostname&gt;

【讨论】:

VM 已启动,我可以连接。没有线索 :( 刚试过 jconsole,也失败了。 这是否意味着您可以从 Mac OS X 连接到端口 8086 到您的 VM? jconsole 不起作用我并不感到惊讶。 VisualVM 和 jconsole 都使用相同的代码来进行 JMX 连接。您可以尝试在您的虚拟机上运行 tcpdump 并查看端口 8086 上是否有任何通信。哦,我刚刚注意到 tcp6 - 这是否意味着您使用的是 IPv6?如果是这样,这可能是您无法连接到 Tomcat 的原因。 谢谢。我会看看我是否可以以某种方式将它包装在 ipv4 中。【参考方案8】:

确保jstatd 进程正在您要监控的远程计算机上运行,​​并具有所需的权限。

【讨论】:

【参考方案9】:

我建议使用这个选项:

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

然后,连接

service:jmx:rmi:///jndi/rmi://machinedomainname:1099/jmxrmi

只要 RMI 正在侦听所有接口(即 0.0.0.0),那么只要防火墙关闭(或仔细配置),从远程服务器连接就应该没有问题。

【讨论】:

【参考方案10】:

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

我敢打赌,问题在于 RMI 连接 - 您无法预测它将使用哪些端口,因此您无法让它与防火墙一起使用。

解决方法是使用 SSH 代理:

    SSH 到您的应用程序正在运行的盒子,但使用 -D 选项,如下所示:

    ssh user@remoteHost -D 9999

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

    打开 JVisualVM 并在首选项中的“网络”下将其配置为在 localhost 的端口 9999 上使用 socks 代理。

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

祝你好运:-)

【讨论】:

以上是关于仍然无法通过 VisualVM 远程连接 Tomcat 6的主要内容,如果未能解决你的问题,请参考以下文章

VisualVM通过JMX远程连接JVM

使用 VisualVM 分析 tomcat 应用程序

VisualVM 无​​法分析;连接和其他选项卡工作,但采样器选项卡给出:“无法创建 JMX 连接”

使用 visualvm 和 JMX 进行远程监控

[工具使用] visualvm 通过jmx不能连接

VisualVM 的问题 - 连接到远程主机时