有没有人有过远程JMX JConsole的工作?

id_aut 发布于 2018-05-09 jconsole 最后更新 2018-05-09 22:50 368 浏览

看来,我从来没有这样做过去工作。目前,我知道它不起作用。 但是我们启动了我们的Java过程:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
我可以telnet到端口,并且“有东西在那里”(也就是说,如果我不开始这个过程,没有任何答案,但是如果我这样做的话),但我无法让JConsole去填充IP和端口。 看起来应该如此简单,但没有错误,没有噪音,没有任何东西。只是不行。 任何人都知道这个热门技巧?
已邀请:

miure

赞同来自:

你在Linux上运行吗?也许管理代理绑定到localhost: http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1

vsit

赞同来自:

在测试/调试/诊断远程JMX问题时,首先总是尝试在包含MBeanServer的主机(即localhost)上连接,以排除网络和其他非JMX特定问题。

inisi

赞同来自:

您可能遇到防火墙问题。 '问题'是你指定的端口不是唯一使用的端口,它为RMI使用1或甚至2个端口,并且这些端口可能被防火墙阻止。 如果您使用默认的RMI配置,其中一个额外的端口将不会知道,所以您必须打开大量的端口 - 这可能不会让服务器管理员开心。 有一种解决方案不需要打开很多端口,但是我已经使用来自组合源代码片段和技巧 http://forums.sun.com/thread.jspa?threadID=5267091 - 链接不再有效 http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html 甚至有可能建立一个SSH隧道,并仍然能够正常工作:-)

funde

赞同来自:

添加-Djava.rmi.server.hostname='<host ip>'为我解决了这个问题。

zamet

赞同来自:

我在运行Linux Redhat ES3的tomcat上运行JConsole/JVisualVm。 使用以下命令禁用数据包过滤对我来说是个窍门:

/usr/sbin/iptables -I INPUT -s jconsole-host -p tcp --destination-port jmxremote-port -j ACCEPT
其中jconsole-host是运行JConsole的主机名或主机地址,jmxremote-port是为com.sun.management.jmxremote.port设置的用于远程管理的端口号。

eet

赞同来自:

您还需要确保您的计算机名称解析为JMX绑定的IP;不是本地主机也不是127.0.0.1。对我来说,它已经帮助进入了明确定义这一点的主机。

gut

赞同来自:

通过防火墙获得JMX非常困难。问题是标准RMI使用第二个随机分配的端口(在RMI注册表旁边)。 我们有三种解决方案可以工作,但每种情况都需要不同的解决方案:

  1. 通过SSH进行JMX通过Socks代理进行通道,使用具有SSH魔法的标准RMI http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html
  2. JMX MP(替代标准RMI)仅使用一个固定端口,但需要服务器和客户端上的特殊jar http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/
  3. 启动JMX Server表单代码,可以使用标准RMI并使用固定的第二个端口: https://issues.apache.org/bugzilla/show_bug.cgi?id=39055

hquia

赞同来自:

我有这样的解决方案: 如果您的Java进程在防火墙后的Linux上运行,并且您希望在本地计算机上的Windows上启动JConsole/Java VisualVM/Java Mission Control,以将其连接到Java进程的JMX端口。 您需要通过SSH登录访问您的Linux机器。所有通信都将通过SSH连接进行隧道传输。 提示:无论是否有防火墙,本解决方案都可以正常工作。 缺点:每次你重新启动你的java进程,你都需要再次执行4 - 9的所有步骤。 点击

1。您需要从这里获取Windows机器的putty套件:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html At least the putty.exe
点击

2。在你的linux机器上定义一个空闲的端口:
<jmx-remote-port>

实施例
jmx-remote-port = 15666      
点击

3。在linux机器上添加参数给java进程 这必须完全如此。如果它完成如下,它适用于防火墙后面的Linux机器(它起作用-Djava.rmi.server.hostname=localhost参数的原因)。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

实施例
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main
点击

4。获取Java进程的进程ID
ps -ef | grep <java-processname>
result ---> <process-id>

实施例
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
点击

5。查找RMIServer存根下载的任意端口 java进程在linux机器上打开一个新的TCP端口,RMI服务器存根将在其中提供下载。此端口也需要通过SSH隧道才能连接到Java虚拟机。 使用netstat -lp这个端口也可以被发现,lsof -i给出了什么端口已经从java进程打开的提示。 注:Java进程启动时,此端口始终更改。
netstat -lp | grep <process-id>
tcp        0      0 *:<jmx-remote-port>     *:*     LISTEN      24321/java
tcp        0      0 *:<rmi-server-port>     *:*     LISTEN      24321/java
result ---> <rmi-server-port>

实施例
netstat -lp | grep 24321
tcp        0      0 *:15666     *:*     LISTEN      24321/java
tcp        0      0 *:37123     *:*     LISTEN      24321/java
result ---> 37123
点击

6。用putty 从Windows机器启用两个SSH隧道
Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local       
[x] Auto
Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local       
[x] Auto

实施例
Source port: 15666
Destination: localhost:15666
[x] Local       
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local       
[x] Auto
点击 Settings to open an SSL tunnel via Putty 点击

7。在启用此SSH-Tunnel的情况下使用Putty登录到您的Linux机器。 保持腻子会话打开。 登录后,Putty将通过SSH端口22将所有TCP连接发送到Linux计算机。 JMX端口:
Windows machine: localhost:15666   >>> SSH >>>   linux machine: localhost:15666
RMIServer的存根端口:
Windows Machine: localhost:37123   >>> SSH >>>   linux machine: localhost:37123
点击

8。使用以下URL 启动JConsole/Java VisualVM/Java Mission Control以连接到Java Process 这会起作用,导致JConsole/Java VisualVM/Java Mission Control认为您连接到本地Windows机器上的端口。但Putty会将所有有效负载发送到端口15666到您的Linux机器。 在Linux机器上,首先java进程给出答案并发回RMIServer端口。在这个例子中37123。 然后,JConsole/Java VisualVM/Java Mission Control认为它连接到localhost:37123,putty会将整个有效内容发送到Linux机器 java进程回答并且连接已打开。
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi

实施例
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
点击 Connect via jmx service url 点击

9。享受#8 - ]

zamet

赞同来自:

让JMX通过防火墙并不难。有一个小渔获。你必须转发你的JMX配置端口,即。 9010以及它在我的机器上监听的动态端口之一,它是> 30000

eet

赞同来自:

专家提示: RMI端口在任意端口打开。如果您有防火墙并且不想打开端口1024-65535(或使用vpn),则需要执行以下操作。 您需要修复(如具有已知数字)RMI注册表和JMX/RMI服务器端口。您可以通过在lib-dir中添加一个jar文件(catalina-jmx-remote.jar,它位于extra的),并在服务器下配置一个特殊的侦听器来实现:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
      rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
(当然还有用于激活JMX的通常标志
    -Dcom.sun.management.jmxremote  \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Djava.rmi.server.hostname=<HOSTNAME> \
请参阅:http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html上的JMX远程生命周期监听器 然后你可以使用这个可怕的URL连接:
service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi

killo

赞同来自:

在过去的几天中将Google-fu放入测试之后,在编译Stack Overflow和http://help.boomi.com/atomsphere/GUID-F787998C-53C8-4662-AA06-8B1D32F9D55B.html这个页面的答案之后,我终于可以开始工作了。 从Dell Boomi页面重新发布:

To Enable Remote JMX on an Atom
If you want to monitor the status of an Atom, you need to turn on Remote JMX (Java Management Extensions) for the Atom.
Use a text editor to open the <atom_installation_directory>\bin\atom.vmoptions file.
Add the following lines to the file:
-Dcom.sun.management.jmxremote.port=5002
-Dcom.sun.management.jmxremote.rmi.port=5002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
我没有看到任何Stack Overflow答案的一行是
-Dcom.sun.management.jmxremote.rmi.port=5002
就我而言,我试图检索Kakfa指标,所以我只是将上述选项更改为匹配-Dcom.sun.management.jmxremote.port值。因此,如果没有任何类型的身份验证,最低限度的配置应该如下所示:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=(jmx remote port)
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=(jmx remote port)
-Djava.rmi.server.hostname=(CNAME|IP Address)

uqui

赞同来自:

这里已经有了一些很好的答案,但是,我认为这是一种比较简单的方法,值得分享。 sushicutta的方法很好,但是非常手动,因为您必须每次都得到RMI端口。幸运的是,我们可以通过使用SOCKS代理而不是明确打开端口隧道来解决这个问题。这种方法的缺点是您在机器上运行的JMX应用程序需要能够配置为使用代理服务器。大多数流程可以通过添加java属性来完成,但有些应用程序不支持这一点。 脚步:

  1. 将JMX选项添加到远程Java服务的启动脚本中:
    -Dcom.sun.management.jmxremote=true
    -Dcom.sun.management.jmxremote.port=8090
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    
  2. 设置一个到您的远程机器的SOCKS代理连接:
    ssh -D 9696 user@remotemachine.com
    
  3. 配置您的本地Java监控应用程序以使用SOCKS代理(localhost:9696)。注意:您有时可以从命令行执行此操作,即:
    jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9696
    

aeius

赞同来自:

这些是我工作的步骤(debian在服务器端的防火墙后面,通过本地Mac上的VPN访问): 检查服务器IP

hostname -i
使用JVM参数:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=[jmx port]
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=[server ip from step 1]
运行程序 找到正在运行的java进程的pid 检查JMX/RMI使用的所有端口
netstat -lp | grep [pid from step 4]
打开防火墙上步骤5的所有端口 瞧。

eomnis

赞同来自:

我正在使用boot2docker来运行Docker容器和Tomcat,我也遇到了同样的问题,解决方案是:

  • 新增-Djava.rmi.server.hostname=192.168.59.103
  • 在主机和docker容器中使用相同的JMX端口,例如:docker run ... -p 9999:9999 ...。使用不同的端口不起作用。

uut

赞同来自:

检查你的服务器是否在防火墙后面。 JMX基于RMI,它在启动时打开两个端口。一个是寄存器端口,默认值为1099,可以通过com.sun.management.jmxremote.port选项指定。另一个是数据通信,是随机的,这是造成问题的原因。一个好消息是,从JDK6开始,这个随机端口可以由com.sun.management.jmxremote.rmi.port选项指定。

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

znihil

赞同来自:

为了做出贡献,这就是我在Tomcat 6的CentOS 6.4上所做的。

  1. 关闭iptables服务
    service iptables stop
    
  2. 将以下行添加到tomcat6.conf
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8085 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=[host_ip]"
    
这样我就可以使用JConsole从另一台PC进行连接。

kalias

赞同来自:

试用Java 8 该解决方案也适用于防火墙

1。把它添加到远程主机上的Java启动脚本中:
-Dcom.sun.management.jmxremote.port=1616
-Dcom.sun.management.jmxremote.rmi.port=1616
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

2。在您的计算机上执行此操作。
  • Windows用户: putty.exe -ssh user@remote-host -L 1616:remote-host:1616
  • Linux和Mac用户: ssh user@remote-host -L 1616:remote-host:1616

    3。在计算机上启动jconsole
    jconsole localhost:1616
    

    4。玩得开心! P.S .:在步骤2中,使用ssh-L指定本地(客户端)主机上的端口1616必须被转发到远程端。这是一个ssh隧道,有助于避免防火墙或各种网络问题。

qea

赞同来自:

Sushicutta的步骤4-7可以通过将以下行添加到步骤3来跳过:

-Dcom.sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>
例如 添加到启动参数:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.rmi.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
对于端口转发,请使用:
ssh -L 12345:localhost:12345 <username>@<host>
如果你的主人是踏脚石,只需在上面的步骤石上运行以下代码,就可以简单地链接端口:
ssh -L 12345:localhost:12345 <username>@<host2>
请注意,需要hostname = localhost才能确保jmxremote告诉rmi连接使用隧道。否则,它可能会尝试连接并直接击中防火墙。

lvero

赞同来自:

我试图让JMC运行Flight Recorder(JFR)来在远程服务器上配置NiFi,该服务器不提供运行JMC的图形环境。 基于这里给出的其他答案,以及经过多次试验和错误,下面是我在启动NiFi时为JVM提供的内容(conf/bootstrap.conf):

java.arg.90=-Dcom.sun.management.jmxremote=true
java.arg.91=-Dcom.sun.management.jmxremote.port=9098
java.arg.92=-Dcom.sun.management.jmxremote.rmi.port=9098
java.arg.93=-Dcom.sun.management.jmxremote.authenticate=false
java.arg.94=-Dcom.sun.management.jmxremote.ssl=false
java.arg.95=-Dcom.sun.management.jmxremote.local.only=false
java.arg.96=-Djava.rmi.server.hostname=10.10.10.92  (the IP address of my server running NiFi)
我确实把它放在/ etc/hosts中,尽管我怀疑它是需要的:
10.10.10.92   localhost
然后,在启动JMC后,我使用这些属性创建远程连接:
Host: 10.10.10.92
Port: 9098
User: (nothing)
Password: (ibid)
顺便说一句,如果我点击自定义JMX服务的URL,我看到:
service:jmx:rmi:///jndi/rmi://10.10.10.92:9098/jmxrmi
这终于为我做了。