似乎我从来没有让这个工作过去。目前,我知道它不起作用。
但我们启动了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和端口。
似乎它应该如此简单,但没有错误,没有噪音,没有任何东西。只是不起作用。
有人知道这方面的热门提示吗?
答案 0 :(得分:122)
我有一个解决方案:
如果 Java进程在防火墙后的Linux上运行,并且您希望在本地计算机上的Windows上启动 JConsole / Java VisualVM / Java Mission Control 以进行连接到Java进程的 JMX端口。
您需要通过SSH登录访问您的Linux机器。所有通信都将通过SSH连接进行隧道传输。
提示:无论是否有防火墙,此解决方案都能正常运行。
缺点:每次重新启动您的java进程时,您需要再次执行4 - 9的所有步骤。
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
至少 putty.exe
<jmx-remote-port>
jmx-remote-port = 15666
这必须完全像这样。如果它完成如下,它适用于防火墙后面的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
ps -ef | grep <java-processname>
result ---> <process-id>
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
java进程在linux机器上打开一个新的TCP端口,可以下载RMI Server-Stubs。此端口还需要通过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
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
让putty会话保持打开状态。
当您登录时,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
这很有效,因为JConsole / Java VisualVM / Java Mission Control认为您连接到本地Windows计算机上的端口。但Putty将所有有效负载发送到您的linux机器的端口15666。
在linux机器上,首先java进程给出答案并发送回RMIServer端口。在这个例子中37123。
然后JConsole / Java VisualVM / Java Mission Control认为它连接到localhost:37123并且putty会将整个有效负载发送到linux机器
java Process回答并且连接已打开。
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
答案 1 :(得分:79)
添加-Djava.rmi.server.hostname='<host ip>'
为我解决了这个问题。
答案 2 :(得分:46)
此解决方案也适用于防火墙
-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
Windows用户:
putty.exe -ssh user@remote-host -L 1616:remote-host:1616
Linux和Mac用户:
ssh user@remote-host -L 1616:remote-host:1616
jconsole
jconsole localhost:1616
P.S。:在步骤2中,使用ssh
和-L
指定本地(客户端)主机上的端口1616必须转发到远程端。这是一个ssh隧道,有助于避免防火墙或各种网络问题。
答案 3 :(得分:19)
您可能遇到防火墙问题。 “问题”是您指定的端口不是唯一使用的端口,它为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隧道并让它继续工作: - )
答案 4 :(得分:17)
在过去几天让我的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)
答案 5 :(得分:11)
你在Linux上运行吗?管理代理程序可能绑定到localhost:
http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1
答案 6 :(得分:7)
Sushicutta的步骤4-7可以通过在步骤3中添加以下行来跳过:
-Dcom.sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>
e.g。 添加启动参数:
-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连接使用隧道。否则它可能会尝试连接directy并点击防火墙。
答案 7 :(得分:6)
PROTIP:
RMI端口在任意portnr处打开。如果您有防火墙并且不想打开端口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
答案 8 :(得分:5)
检查您的服务器是否在防火墙后面。 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"
答案 9 :(得分:4)
通过防火墙获取JMX真的很难。问题是标准RMI使用第二个随机分配的端口(在RMI注册表旁边)。
我们有三种解决方案可行,但每种情况都需要不同的解决方案:
使用Socks代理的SSH隧道上的JMX,使用标准的RMI和SSH魔术 http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html
JMX MP(标准RMI的替代品),只使用一个固定端口,但在服务器和客户端上需要一个特殊的jar http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/
启动JMX Server表单代码,可以使用标准RMI并使用固定的第二个端口: https://issues.apache.org/bugzilla/show_bug.cgi?id=39055
答案 10 :(得分:2)
在测试/调试/诊断远程 JMX问题时,首先总是尝试在包含MBeanServer(即localhost)的同一主机上进行连接,以排除网络和其他非JMX特定问题。
答案 11 :(得分:2)
这里已经有了一些很好的答案,但是,我认为值得分享的方法稍微简单一些。
sushicutta的方法很好,但是非常手动,因为你必须每次都获得RMI端口。值得庆幸的是,我们可以通过使用SOCKS代理而不是显式打开端口隧道来解决这个问题。这种方法的缺点是您在计算机上运行的JMX应用程序需要能够配置为使用代理。大多数流程都可以通过添加java属性来实现,但是,某些应用程序不支持此功能。步骤:
将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
设置与远程计算机的SOCKS代理连接:
ssh -D 9696 user@remotemachine.com
配置本地Java监控应用程序以使用SOCKS代理(localhost:9696)。注意:您可以有时从命令行执行此操作,即:
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9696
答案 12 :(得分:1)
我正在使用boot2docker运行内部有Tomcat的docker容器,我遇到了同样的问题,解决方法是:
-Djava.rmi.server.hostname=192.168.59.103
docker run ... -p 9999:9999 ...
。使用不同的端口不起作用。答案 13 :(得分:1)
我在运行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设置的用于远程管理的端口号。
答案 14 :(得分:1)
以下内容对我有用(尽管我认为端口2101对此没有真正的贡献):
-Dcom.sun.management.jmxremote.port=2100
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=2101
-Djava.rmi.server.hostname=<IP_ADDRESS>OR<HOSTNAME>
我正在从远程计算机连接到运行Docker且服务器位于容器内部的服务器。另外,我停止了firewallD,但我认为这不是问题,因为即使打开防火墙也可以远程登录到2100。 希望对您有所帮助。
答案 15 :(得分:0)
这些步骤对我有用(服务器端防火墙后面的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步的所有端口
瞧。
答案 16 :(得分:0)
让JMX通过防火墙并不是那么难。有一个小渔获。你必须转发你的JMX配置端口,即。 9010和它在我的机器上监听的动态端口之一是&gt; 30000
答案 17 :(得分:0)
为了做出贡献,这就是我在CentOS 6.4 for Tomcat 6上所做的。
关闭iptables服务
service iptables stop
将以下行添加到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连接。
答案 18 :(得分:0)
您还需要确保您的计算机名称解析为JMX绑定的IP;不是localhost也不是127.0.0.1。对我来说,它有助于在明确定义它的主机中放入一个条目。
答案 19 :(得分:0)
我正在尝试运行飞行记录器(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)
顺便说一句,如果我单击Custom JMX服务URL,我会看到:
service:jmx:rmi:///jndi/rmi://10.10.10.92:9098/jmxrmi
这终于为我做了。