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

时间:2010-02-19 10:00:04

标签: java tomcat monitoring tomcat6 visualvm

如果检查了有关此问题的其他问题,但到目前为止没有任何灵魂。 这是我的设置: 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连接时: - 添加一个主机名为my vm的新主机(将其添加到/ etc / hosts) - 添加新的JMX-Connection

VisualVM失败了:

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

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

这可能是外国主机被大量阻止访问rmiregistry的问题吗? 为什么有人会这么蠢呢?

我做错了什么?

(抱歉4冗长的帖子)

10 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

按照以下步骤操作

  • Download Jvisualvm

  • 下载jvisualvm设置
  • 解压缩此设置并从命令行转到bin目录

  • 使用此命令启动visualvm:

    \ bin&gt; 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

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

  • 在连接框中说localhost:source_port_provided_in_putty_tunnel

  • 点击“确定”按钮即可完成。

答案 5 :(得分:1)

所以上面对我有用:

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

花了半天时间。遵循所有通常的指示并且变得沮丧,上面破解了它。

我在amazon 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>

我在我的mac上本地运行jvisualvm。

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

 <mymachinedomainname>

然后添加了一个jmx连接到这个主机。 我尝试了推荐的

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

但它不会连接。

但是我一做到了

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

代替。它连接和工作。

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

答案 6 :(得分:0)

确保您可以

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

另请注意,您可以使用IP地址代替<vmhostname>

答案 7 :(得分:0)

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

答案 8 :(得分:0)

我建议使用此选项:

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

然后,连接

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

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

答案 9 :(得分:0)

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

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

解决方法是使用SSH代理:

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

    ssh user @ remoteHost -D 9999

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

  2. 打开JVisualVM并在首选项中,在&#39; network&#39;将其配置为在localhost上使用socks代理,在端口9999上。

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

    祝你好运: - )