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

JLM*_*JLM 6 java jmx rmi 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似乎总是在寻找未知的服务器.

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

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

拜托,帮助我,我疯了!

Boz*_*zho 7

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

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

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

    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
        rmiRegistryPortPlatform="9009" rmiServerPortPlatform="9010" />
    
    Run Code Online (Sandbox Code Playgroud)

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

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

参考文献:

  • 你应该补充说,还必须将`catalina-jmx-remote.jar`复制到`CATALINA_HOME/libs`中,否则抛出`ClassNotFoundException`.有关此主题的进一步阅读,请参阅http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html#JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener (2认同)