使用VisualVM和SSH远程监视Tomcat 7服务器

时间:2012-09-07 01:18:51

标签: ssh tomcat7 jmx visualvm

很抱歉,如果这是以前提出的问题的重复,但我已经尝试了此处和其他地方提供的解决方案,但这些解决方案似乎都不适用于我。

场景:我需要分析一个生活在防火墙后面的生产Tomcat 7服务器。我只有SSH访问此服务器。选择性能分析工具是Visualvm,这些服务器没有安装GUI。我尝试连接的服务器和机器都运行Ubuntu 10.04服务器LTS。

可能的解决方案:在SSH隧道上使用visualvm似乎是可能的,下面给出的链接提供了一个非常详细的指南:

Tomcat+VisualVM+SSH guide

我还在Tomcat的/ conf目录中添加了一个jmxremote.access文件,其中包含以下两行:

monitorRole readonly
controlRole readwrite

问题:我按照文章中提供的步骤进行操作,一切似乎都没问题。我可以使用jmxterm和指南中给出的连接字符串在本地(从服务器)连接到服务器中的jmx端口。

我根据指南配置了本地tomcat作为测试,Visualvm使用连接字符串连接到这个tomcat实例没有问题。

但是,VisualVM不会通过SSH隧道连接到远程服务器。我尝试了JConsole,因为它更简单,并且具有更好的日志记录功能,我得到以下消息序列:

FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi]  connecting...
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] finding stub...
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] connecting stub...
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] getting connection...
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] failed to connect: java.rmi.NoSuchObjectException: no such object in table

关于我在这里做错了什么的任何想法?非常感谢任何帮助!

谢谢。

2 个答案:

答案 0 :(得分:2)

我认为您所遇到的问题(参考文章没有真正解决的问题)是jmx-rmi,或者更具体地说,RMI本身的工作方式。您的Tomcat服务器设置如下:

  1. 创建了一个RMI远程服务器,配置为连接到 localhost:12009
  2. 在localhost上创建了一个RMI注册表,其侦听端口为 localhost:12008
  3. 当你在本地运行时,你在RMI注册表中查找存根,当你调用存根发出jmx调用时,它连接到 localhost:12009 ,没问题。

    当您通过SSH远程运行时,我假设您已通过端口12008从远程隧道连接到tomcat服务器,因此当您发出请求时,您的远程 localhost:12008已通过隧道传输到tomcatServer:12008,因为日志输出似乎表明您发现存根确定。

    接下来,您的远程执行存根,而存根又尝试连接到localhost:12009并失败。

    我的猜测是你需要隧道你的遥控器的本地主机:12008 localhost:12009被重定向到tomcatServer:12008 tomcatServer:12009。

    解决此问题的另一种方法是抛弃RMI jmx协议并使用类似Jolokia(HTTP),JMX-WS(HTTP WebService)或JMXMP(套接字)的方法。这将使您的SSH调优生活更轻松。如果你想尝试JMXMP,我创建了一个名为OpenDMK的github项目,该项目具有mavenized构建。您需要jmx-optional包。

答案 1 :(得分:0)

谢谢你的提问! - 我有同样的基本需求。对不起,我实际上并没有在这里添加任何新内容,但我想提一下你提供的参考资料:   https://www.liferay.com/web/thiago.moreira/blog/-/blogs/how-to-monitor-liferay-tomcat-remotely-through-firewalls-using-visualvm 刚刚为我工作(只需要与最新版本相关的非常小的调整 - Tomcat 7和VisualVM 1.3.8)。在我的情况下,Tomcat在CentOS 6.6上运行,监控机器是Mac(也许这可以帮助其他人)。再次感谢。