无法远程连接到JMX?
由于某种奇怪的原因,我无法使用VisualVM
或jconsole
连接到JMX。无法远程连接到JMX?
用来启动虚拟机中的参数进行监控:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1100
我检查,我可以telnet到这个端口,从本地和远程。
尽管如此,VisualVM或jconsole仍然无法连接。
REMOTE MACHINE with JMX (debian)
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)
MY WORKSTATION (OS X)
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
什么问题?
除了监听您指定的端口(1100)之外,JMX服务器还会监听随机选择的(临时)端口。检查,例如与lsof -i|grep java
如果你在linux/osx上,java进程会监听哪些端口并确保你的防火墙对于临时端口是开放的。
添加-Djava.rmi.server.hostname = host ip
。即使我面临同样的问题,这就是诀窍。
另外这款-Djava.rmi.server.hostname = host ip
军队RMI服务的使用主机的ip 127.0.0.1而不是
的我才发现,我的RMI服务中的主机IP这是“127.0.0.1”运行的问题。要远程连接到jvm,我必须将外部IP绑定到主机名。要在unix系统中执行此操作,请使用命令hostname
获取主机名的名称。然后检查分配给主机名的IP,找出这个使用ping $(hostname)
你会看到系统正在ping主机名的IP。如果您的主机ip是默认的“127.0.0.1”,并且您想更改它,只需以超级用户身份编辑文件/ etc/hosts即可。重新启动rmi服务后,您可以从远程机器访问它。
在某些环境中'hostname'会给你错误的答案。要在AWS EC2上获得正确的外部IP,请使用:'ip = $(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)' – 2016-10-24 04:44:49
我遇到了问题,它说'永远添加',似乎无法连接。我通过更改jvisualvm代理设置(工具 - >选项 - >网络)来解决问题。一旦我将选项更改为无代理服务器,我就可以连接。我的JVM启动时使用下列选项:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=2222
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=<external_IP_of_server>
然后,当我加了JMX连接,我指定的“external_IP_of_server:2222”
这些是为我工作(Debian的防火墙后面的服务器上的步骤一边是从我本机的Mac已达VPN):
-
检查服务器的IP
主机名-i
使用JVM PARAMS:
-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程序的查找过程ID
-
检查所有JMX/RMI使用的端口
netstat -lp | grep [pid from step 4]
打开所有来自步骤5防火墙
瞧上端口。
谢谢! 我缺少'netstat -lp | grep [pid from step 4]' – user454322 2015-04-22 10:25:32
在我的情况下,我错过了“java.rmi.server.hostname”...之后,添加了该属性,我能够连接到我的远程虚拟机使用java VisualVM – 2016-04-14 19:04:57
在我们的事实证明,需要更多的端口,而不仅仅是通过'jmxremote.port'指定的端口。我们询问ops打开VPN后面的机器的所有端口,并能够连接。意外的是并没有减少端口曝光的机器还没有提供更多的数据。 – fionbio 2016-04-21 18:53:00
我在使用端口转发时遇到类似的问题。 我有一台远程机器,Tomcat正在监听localhost:9000
上的JMX交互。
从我的本地机器上,我已经习惯了做端口转发有:
ssh -L 9001:localhost:9000 tomcat.example.com
(所以远程端口9000转发到我的本地机器的端口9001)。
然后,当我尝试使用VisualVM连接到localhost:9001
时,连接被拒绝。 JMX似乎要求双方的端口号相同。
所以我的解决办法是使用的端口号9000和9000:
ssh -L 9000:localhost:9000 tomcat.example.com
现在我的本地机器的VisualVM的通过localhost:9000
成功连接到远程机器上的Tomcat。
确保您没有任何其他服务(开发机器上的Tomcat?)侦听同一端口。
仅提供-Dcom.sun.management.jmxremote.port = 1100后,您可以在本地运行VisualVM,但通过端口连接而不是通过连接? – 2012-08-02 20:17:29
如果有防火墙发挥参见[1] [1] [这个问题]:HTTP://计算器。com/a/19315119/2870472 – supdog 2013-10-11 10:10:58
通过ssh隧道设置,更容易很多 – 2017-10-31 11:50:08