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

Posted

技术标签:

【中文标题】使用 VisualVM 和 SSH 远程监控 Tomcat 7 服务器【英文标题】:Remote monitoring a Tomcat 7 server using VisualVM and SSH 【发布时间】:2012-09-07 01:18:51 【问题描述】:

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

场景:我需要分析位于防火墙后面的生产 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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

当您通过 SSH 远程运行时,我假设您已从远程隧道通过端口 12008 连接到 tomcat 服务器,因此当您发出请求时,您的远程localhost:12008 被隧道连接到@ 987654328@,因为日志输出似乎表明您找到了 stub ok。

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

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

解决此问题的另一种方法是放弃 RMI jmx 协议并使用 Jolokia (HTTP)、JMX-WS (HTTP WebService) 或 JMXMP (Socket) 之类的东西。这将使您的 SSH 调谐生活变得更加轻松。如果您想尝试 JMXMP,我创建了一个名为 OpenDMK 的 github 项目,该项目具有 mavenized 构建。你会想要jmx-optional 包。

【讨论】:

尼古拉斯,谢谢你的回答。我确实将 localhost:12008 和 localhost:12009 都通过隧道连接到了 tomcat 服务器上的相应端口。它只是不工作。我接受了您的建议来尝试 JMXMP,它的效果非常好。谢谢。 您可以使用标准 RMI 和 SSH 隧道,请参阅 ***.com/questions/1609961/visualvm-over-ssh/…【参考方案2】:

感谢您的提问! ——我有同样的基本需求。抱歉,我实际上并没有在这里添加任何新内容,但我想我会提到您提供的参考: 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(也许这可以帮助其他人)。再次感谢。

【讨论】:

以上是关于使用 VisualVM 和 SSH 远程监控 Tomcat 7 服务器的主要内容,如果未能解决你的问题,请参考以下文章

jmx/jstatd 通过 ssh 隧道访问远程机器

使用VisualVM远程监控JVM Linux服务器配置方法

使用visualvm远程监控LINUX服务器JVM

Java性能监控工具:VisualVM

visualvm监控jvm及远程jvm监控方法

使用jdk自带的visualVM监控远程监控was