VisualVM通过防火墙 - RMI故障排除

时间:2011-02-18 18:47:51

标签: java rmi jmx visualvm

很抱歉这个问题必须多次提出,但我无法成功解决我的问题。 我已经阅读了很多博客,网站,论坛......并且在我的案例中找不到任何解决方案。

案例 我需要将我的盒子上的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地址与远程服务器网络中的主机名和IP地址不同。

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

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

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

请帮帮我,我疯了!

3 个答案:

答案 0 :(得分:7)

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

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

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

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

然后在防火墙上打开这两个端口。有用。但这只是为了tomcat。

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

参考文献:

答案 1 :(得分:1)

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

  1. 以这种方式在远程主机中启动ejstatd(在ejstatd文件夹中):mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101"(用于&#34; jstatd&#34;类型连接)
  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](用于&#34; JMX&#34;类型连接)(此处仅需要java.rmi.server.hostname因为网络中的IP和主机名与服务器的观点不同))
  3. 打开远程主机上的这4个端口,并将其提供给您的本地计算机:1099110011011102
  4. 启动JVisualVM
    1. 右键单击&#34; Remote&#34; &GT; &#34;添加远程主机...&#34;并在&#34;主机名&#34;中输入您的远程主机名(如果您不使用端口1099,则可以在&#34;高级设置&#34;中更改此内容。)
    2. 右键点击您刚创建的远程主机&gt; &#34;添加JMX连接...&#34;并输入&#34; [remote_host_name]:1102&#34; in&#34; Connection&#34;输入,并检查&#34;不要求SSL连接&#34;
    3. 您的Java进程将出现两次:一个来自&#34; jstatd&#34;连接类型,以及来自&#34; JMX&#34;连接类型。
  5. 免责声明:我是开源ejstatd工具的作者。

答案 2 :(得分:0)

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

相关问题