有没有人有远程JMX JConsole工作?
看来我以前从来没有这样的工作。 目前,我知道这是行不通的。
但是我们启动了我们的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和端口。
好像应该这么简单,但没有错误,没有噪音,没有任何东西。 只是不行。
任何人都知道这个热门的提示?
我有一个这样的解决scheme:
如果您的Java进程在防火墙后的Linux上运行,并且您希望在本地计算机上的Windows上启动JConsole / Java VisualVM / Java Mission Control ,以将其连接到Java进程的JMX端口 。
您需要通过SSHlogin访问您的Linux机器。 所有通信将通过SSH连接隧道传输。
提示:无论是否有防火墙,本解决scheme都可以正常工作。
缺点:每次你重新启动你的java进程,你都需要再次执行从4到9的所有步骤。
1.你需要从你的Windows机器的腻子套件:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html上;
至lessputty.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.findRMIServer存根下载的任意端口
java进程在linux机器上打开一个新的TCP端口,RMI服务器存根可以在这里下载。 此端口还需要通过SSH隧道才能连接到Java虚拟机。
使用netstat -lp
这个端口也可以被findlsof -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
7.使用Putty在启用此SSH-Tunnel的情况下login到您的Linux机器。
保持腻子会话打开。
当您login时,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机器上的一个端口。 但腻子发送所有的有效载荷到端口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
9.享受#8-]
添加-Djava.rmi.server.hostname='<host ip>'
为我解决了这个问题。
尝试与Java 8
这个解决scheme也适用于防火墙
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.玩得开心!
PS:在步骤2中,使用ssh
和-L
指定本地(客户端)主机上的端口1616必须转发到远程端。 这是一个SSH隧道,有助于避免防火墙或各种networking问题。
您可能遇到防火墙问题。 问题在于你指定的端口不是唯一使用的端口,它为RMI使用1或甚至2个端口,并且可能被防火墙阻塞。
如果您使用默认的RMIconfiguration,其中一个额外的端口将不会知道,所以您必须打开一个大范围的端口 – 这可能不会使服务器pipe理员感到愉快。
有一个解决scheme,不需要打开很多端口,但我已经得到它使用来源合并的源代码片段和技巧
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隧道,并仍然能够正常工作:-)
在过去的几天里,我把Google-fu放到了testing之后,终于在编译Stack Overflow和这个页面的答案之后得到了这个工作。http://help.boomi.com/atomsphere/GUID-F787998C- 53C8-4662-AA06-8B1D32F9D55B.html 。
从戴尔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
我没有看到任何堆栈溢出答案覆盖的一行是
-Dcom.sun.management.jmxremote.rmi.port=5002
在我的情况下,我试图检索Kakfa指标,所以我只是改变了上述选项以匹配-Dcom.sun.management.jmxremote.port
值。 所以,没有任何的身份validation,最低限度的configuration应该是这样的:
-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)
你在Linux上运行吗? 也许pipe理代理绑定到本地主机:
http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1
专家提示:
RMI端口在任意端口打开。 如果您有防火墙,并且不想打开端口1024-65535(或使用vpn),则需要执行以下操作。
您需要修复RMIregistry和JMX / RMI服务器端口(如具有已知编号)。 您可以通过在lib-dir中添加一个jar文件(catalina-jmx-remote.jar,它在extra中),并在服务器下configuration一个特殊的侦听器来实现:
<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
检查你的服务器是否在防火墙后面。 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"
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连接使用隧道。 否则,它可能会尝试连接直接击中防火墙。
通过防火墙获得JMX是非常困难的。 问题是标准RMI使用第二个随机分配的端口(在RMIregistry旁边)。
我们有三种解决scheme可以工作,但是每种情况都需要不同的解决scheme
-
基于SSH的JMX隧道与Socks代理,使用标准的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服务器表单代码,可以使用标准RMI并使用固定的第二个端口: https : //issues.apache.org/bugzilla/show_bug.cgi?id=39055
在testing/debugging/诊断远程 JMX问题时,首先总是尝试在包含MBeanServer(即localhost)的同一主机上连接,以排除networking和其他非JMX特定问题。
我在运行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设置的用于远程pipe理的端口号。
这里已经有了一些很好的答案,但是,我认为这是一个比较简单的方法,值得分享。
sushicutta的方法是好的,但是非常手动,因为你必须每次获得RMI端口。 值得庆幸的是,我们可以通过使用SOCKS代理而不是明确打开端口隧道来解决这个问题。 这种方法的缺点是您在机器上运行的JMX应用程序需要能够configuration为使用代理服务器。 大多数stream程可以通过添加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
-
configuration您的本地Java监视应用程序以使用SOCKS代理(localhost:9696)。 注意: 有时你可以从命令行执行此操作,即:
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9696
我正在使用boot2docker来运行Docker容器和Tomcat,我也遇到了同样的问题,解决办法是:
- 添加
-Djava.rmi.server.hostname=192.168.59.103
- 在主机和docker容器中使用相同的JMX端口,例如:
docker run ... -p 9999:9999 ...
使用不同的端口不起作用。
您还需要确保您的计算机名称parsing为JMX绑定的IP; 不是本地主机也不是127.0.0.1。 对我来说,它已经帮助进入到明确定义这个的主机。
通过防火墙获取JMX并不难。 有一个小渔获。 你必须转发你的JMXconfiguration的端口即。 9010和其中一个dynamic端口监听我的机器是> 30000
这些是我工作的步骤(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]
运行应用程序
find正在运行的java进程的pid
检查JMX / RMI使用的所有端口
netstat -lp | grep [pid from step 4]
打开防火墙上第5步的所有端口
瞧。
为了做出贡献,这就是我在Tomcat 6的CentOS 6.4上所做的。
-
closuresiptables服务
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进行连接。
我试图让JMC运行Flight Recorder(JFR)来在远程服务器上对NiFi进行configuration文件,该服务器不提供运行JMC的graphics环境。
基于这里给出的其他答案,经过多次试验和错误,这里是我提供给JVM( conf / bootstrap.conf )当我启动NiFi的时候:
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中 ,尽pipe我怀疑这是需要的:
10.10.10.92 localhost
然后,在启动JMC之后,我使用这些属性创build一个远程连接:
Host: 10.10.10.92 Port: 9098 User: (nothing) Password: (ibid)
顺便说一句,如果我点击自定义JMX服务的URL,我看到:
service:jmx:rmi:///jndi/rmi://10.10.10.92:9098/jmxrmi
这终于为我做了。