【问题标题】:VisualVM through firewalls - RMI troubleshootingVisualVM 通过防火墙 - RMI 故障排除
【发布时间】:2011-02-18 18:47:51
【问题描述】:

很抱歉这个问题一定被问了很多次,但我无法成功解决我的问题。 我已经阅读了很多博客、网站、论坛……但在我的情况下没有找到任何解决方案。

案例: 我需要将我盒子上的 VisualVM 连接到远程服务器(tomcats、weblogics)以进行性能/线程/内存监控。 这些服务器安装在受防火墙保护的(物理或虚拟)机器上。 防火墙中开放了大间隔的端口并且可以使用,但不是所有端口。

测试

  • 我已经尝试通过 VisualVM 中的 JMX 直接连接,在服务器启动时在服务器端使用以下 JVM 选项:
    -Djava.rmi.server.hostname=[hostname]
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=[port]
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    

我已经确定了主机名,因为我的网络中服务器的主机名和 IP 地址与远程服务器网络中的不同。

没有成功,VisualVM 似乎总是在寻找未知的服务器。

  • 尝试在服务器端的可访问端口(-p 选项)上从我的机器上启动 jstatd(此端口上的 telnet 有效),但是当使用 jstatd 端口在此主机上启动 visualVM 时,它似乎仍在等待对于无法访问的东西....与 jps 连接到此远程主机的行为相同。

  • 尝试在网络保护较少的服务器上使用相同的工具,并且成功了。所以我已经看到了我的盒子和服务器之间的连接,它们是在与我指定给 jstatd 的端口不同的端口上完成的。 我知道第一次通信(握手)需要这个端口,真正的通信是在其他端口上完成的,但不可预测(例如:60305、55197,...)。 不确定我是否非常了解 RMI 的工作原理。

请帮帮我,我快疯了!

【问题讨论】:

  • 如果您使用的是 Java 7 update 4,则可以使用标志 ``-Dcom.sun.management.jmxremote.rmi.port=7091`` 查看此博文:hirt.se/blog/?p=289跨度>

标签: java rmi jmx visualvm


【解决方案1】:

不幸的是,JMX 尝试打开您配置的端口以外的端口。就在昨天,我成功地通过 JMX 连接到防火墙后面的 tomcat。两个棘手的部分是:

  • 将一个名为jmxremote.access 的文件放入CATALINA_HOME/conf,其中包含以下几行:

    monitorRole readonly
    controlRole readwrite
    
  • server.xml 中设置jmx 将使用的端口,通过一个特殊的tomcat 监听器(/lib 中需要catalina-jmx-remote.jar):

    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
        rmiRegistryPortPlatform="9009" rmiServerPortPlatform="9010" />
    

然后在防火墙上打开这两个端口。有用。但这仅适用于 tomcat。

另一种选择是使用ssh tunnelling。简而言之 - 您通过 SSH 连接并将其配置为将某些本地端口(运行 jmx 客户端的地方)转发到隧道另一端的某些端口。

参考资料:

【讨论】:

  • 您应该添加,还必须将catalina-jmx-remote.jar 复制到CATALINA_HOME/libs 中,否则会抛出ClassNotFoundException。有关此主题的进一步阅读,请参阅tomcat.apache.org/tomcat-6.0-doc/config/…
【解决方案2】:

以下是执行此操作的步骤:

  1. 以这种方式在远程主机中启动ejstatd(在 ejstatd 文件夹中):mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101"(用于“jstatd”类型的连接)
  2. 使用这些额外的 Java 参数启动您的 Java 应用程序:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1102 -Dcom.sun.management.jmxremote.rmi.port=1102 -Djava.rmi.server.hostname=[remote_host_name](用于“JMX”类型的连接)(此处需要java.rmi.server.hostname,只是因为您网络中的 IP 和主机名与查看)
  3. 打开远程主机上的这 4 个端口,使它们可用于本地计算机:1099110011011102
  4. 启动 JVisualVM
    1. 右键单击“远程”>“添加远程主机...”并在“主机名”中输入您的远程主机名(如果您不使用端口1099,您可以在“高级设置”)
    2. 右键单击刚刚创建的远程主机>“添加JMX连接...”并在“连接”输入中输入“[remote_host_name]:1102”,并勾选“不需要SSL连接”
    3. 您的 Java 进程将出现两次:一次来自“jstatd”连接类型,一次来自“JMX”连接类型。

免责声明:我是开源ejstatd 工具的作者。

【讨论】:

    【解决方案3】:

    在您的 [主机名] 上,仅为您的 IP 打开 [端口] 和 tcp 端口范围 40000-60000。 这对我来说很有效。

    【讨论】:

    • 为什么这个答案被否决了这么多?这是唯一真正帮助我的人。
    • 因为只向世界其​​他地方开放几乎所有机器端口可能在开发机器上工作,但在生产/企业环境中肯定不可行。
    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多