我已按照以下链接中的说明在 tomcat 内的单个端口上创建我自己的 RMI 注册表和 jmx 服务器。根据评论,我需要设置-Djava.rmi.server.hostname=localhost。完成后,我确实可以使用 ssh 端口转发通过 jconsole 连接到我的服务器。
http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx
但是,我发现它有破坏我们使用 RMI 的 ehcache 复制的非常糟糕的副作用。它无法提示它无法从远程对等本地主机引导。我猜是因为对等点都通过设置 -Djava.rmi.server.hostname=localhost 将其 rmi 服务器主机名设置为 localhost。
有没有人可以解决这个问题?
最佳答案
我刚遇到这个问题。问题是 java.rmi.servername.hostname 属性是全局的。为了使 ehcache 和 jmx 服务器协调运行,您必须在运行 VisualVM 的机器上执行一些 hack。
这是您需要做的。这是基于为客户端使用 Mac,因此请根据需要修改命令。
删除 -Djava.rmi.server.hostname=localhost。
编写一个测试程序,它将为您提供要分析的服务器计算机上的 InetAddress.getLocalHost().getHostAddress() 的值。这应该给你本地 ip(如果 nat'd 是私有(private)的)。您必须在本地计算机上引用此 IP。在下面的命令说 IP 的地方使用这个 IP。
现在,这是有趣的部分:将内部 IP 添加到计算机上的环回接口(interface)。 (ifconfig lo0 IP netmask 255.255.255.0 up)
测试这实际上会将流量定向到环回。它应该返回环回。 (路由获取IP)
启动 SSH 隧道:ssh -C -L IP:PORT:localhost:PORT -L IP:OTHER_PORT:localhost:OTHER_PORT user@host。
注意 ssh 隧道的 IP 实际上是现在绑定(bind)到环回的 IP。您不再指本地主机,而是指机器的 IP。您还必须修改 JMX URL 以引用此 IP 而不是本地主机。
关于tomcat - 如何使用ssh隧道远程连接到tomcat上的jmx而不破坏ehcache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777631/