【问题标题】:Using VisualVM to connect to a remote jstatd instance through a firewall [duplicate]使用 VisualVM 通过防火墙连接到远程 jstatd 实例 [重复]
【发布时间】:2011-11-17 11:30:55
【问题描述】:

可能重复:
VisualVM over ssh

我正在写这个问题并回答它,因为我今天花了几个小时来解决这个问题,但我在这里找到的答案对我没有用。希望这对其他人有帮助。如果您有其他解决方案,而不是我最终使用的解决方案,请随时回答这个问题。如果你的更好,我会接受你的。

问题:我正在尝试使用 VisualVM 和 jstatd 在我的 FreeBSD 服务器上监控一些自制的 Java 应用程序(这也应该适用于 Linux 服务器),但我无法让 VisualVM 列出服务器上的进程即使我在防火墙中转发了分配的随机 jstatd 端口并且可以看到正在使用 sockstat 建立连接。

【问题讨论】:

    标签: java linux freebsd


    【解决方案1】:

    我没有在每次运行 jstatd 时都创建防火墙规则(因为它每次都会很烦人地选择一个新的随机端口),而是让它与 SSH 隧道一起工作。

    首先我在服务器上运行 jstatd 来查找我需要隧道的端口。这是通过(在我的例子中)首先创建一个名为 tools.policy 的策略文件,其中包含以下内容:

    grant codebase "file:${java.home}/../lib/tools.jar" {
        permission java.security.AllPermission;
    };
    

    然后运行以下命令:jstatd -J-Djava.security.policy=tools.policy

    然后我通过运行sockstat | grep jstat 确定 jstatd 正在使用的随机端口(在 Linux 上可能需要使用 netstat,我不确定)。

    然后假设随机端口是 55663,我在本地机器上创建了两个 SSH 隧道,一个用于标准 jstatd 端口 1099,另一个用于 55663,方法是在两个终端窗口中运行以下命令(尚未在Windows,但我很确定 putty 可以做到):

    ssh -L 1099:localhost:1099 login_name@host_name

    ssh -L 55663:localhost:55663 login_name@host_name

    打开两个隧道后,我打开 VisualVM 并右键单击左侧的“本地”机器并选择“添加 jstatd 连接”。我单击右侧的“添加默认值”按钮并确保端口设置为 1099。我单击“确定”按钮将其保存,并立即看到我的远程 Java 进程出现在“本地”部分。

    【讨论】:

    • 这对我来说可以打开连接并进行基本监控,但我无法进行任何采样。我想我需要更多的东西来让 JMX 工作?我说它无法打开 JMX 连接……
    • 是的,此解决方案仅适用于 jstatd,不适用于 JMX。您可能需要隧道不同的端口,我不确定。我的应用程序还没有 JMX 支持,所以我还没有测试过。
    • 谢谢。我认为这回答了我的问题:stackoverflow.com/questions/3892084/…
    • 您可以使用一个 ssh 命令隧道两个端口,例如`ssh -L 1234:localhost:1234 -L 5555:somehost:5678 user@hostname
    【解决方案2】:

    请参阅此“Running VisualVM through an ssh tunnel with SOCKS”以获取其他解决方案。

    【讨论】:

    • 这是我发现由于某种原因对我不起作用的解决方案之一。我可以让它工作的唯一方法就是按照我在回答中描述的那样做。这就是为什么我想发布这个以防其他人对可用答案有类似的问题。
    • 以上解决方案比较简单。为什么它不起作用?
    • 我执行了该帖子中的步骤,但无法连接。我正在监视服务器上的连接,除非我在防火墙中打开端口,否则没有看到到 jstatd 的传入连接,因此 SOCKS 代理由于某种原因无法工作,即使它是在客户端创建的并且似乎处于活动状态(在本地 SOCKS 端口上使用 telnet 来验证它是否打开)。我获得工作连接的唯一方法是使用答案中的步骤。不知道我的设置有什么不同导致 SOCKS 解决方案不起作用,更不用说为什么打开防火墙时它不起作用了。
    • 这篇文章比较老了,现在不同的是,你可以直接在 VisualVM 中指定 SOCKS 代理。根据您的描述,VisualVM 似乎没有使用您的 SOCKS 代理。如果你想尝试一下,你可以不带任何附加参数启动 VisualVM,并在 VisualVM 偏好设置中指定 SOCKS 代理。
    • 其实我确实尝试过同时使用命令行参数、首选项面板,并且两者都没有成功。不过我今天会仔细检查。
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 2012-03-28
    • 2010-11-12
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多