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

Cha*_*raG 5 ssh jmx visualvm tomcat7

对不起,如果这是以前提出的问题的重复,但我已经尝试了这里和其他地方提供的解决方案,但似乎没有一个对我有效.

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

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

Tomcat + VisualVM + SSH指南

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

monitorRole readonly
controlRole readwrite
Run Code Online (Sandbox Code Playgroud)

问题:我按照文章中提供的步骤进行操作,一切似乎都很好.我可以使用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
Run Code Online (Sandbox Code Playgroud)

关于我在这里做错了什么的任何想法?任何帮助是极大的赞赏!

谢谢.

Nic*_*las 2

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

  1. 创建了一个配置为连接到localhost:12009 的RMI 远程表。
  2. 在 localhost 上创建一个 RMI 注册表,监听端口为localhost:12008

当您在本地运行时,您在 RMI 注册表中查找存根,当您调用存根以发出 jmx 调用时,它会连接到localhost:12009,没有问题。

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

接下来,您的遥控器对存根执行,存根又尝试连接localhost:12009并失败。

我的猜测是,您需要通过隧道将远程主机的 localhost:12008localhost:12009 重定向到 tomcatServer:12008tomcatServer:12009。

解决这个问题的另一种方法是放弃 RMI jmx 协议并使用Jolokia (HTTP)、JMX-WS (HTTP WebService) 或JMXMP (Socket) 等协议。这将使您的 SSH 调整生活变得更加轻松。如果您想尝试 JMXMP,我创建了一个名为OpenDMK 的github 项目,该项目具有 Maven 化版本。您将需要jmx 可选包。