使用jConsole连接远程tomcat JMX实例

我正尝试使用jConsole连接到远程Tomcat JMX实例。 但无法连接成功。 任何想法?

我在远程tomcat catalina.sh包含以下选项:

 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=9004 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false" 

我有一个类似的,如果不是相同的问题。 如果我在本机上启动jconsole,我可以连接到JMX服务器。

看来RMI服务器没有在正确的IP上侦听。 所以,正如在这个相关的问题中所build议的,我添加了以下内容:

 -Djava.rmi.server.hostname=<host ip> 

JAVA_OPTS以及,然后它的工作。

我收集了网上传播的信息,发现其他成员的提示。

JMX引起的大部分痛苦是(imo)JMX打开第二个dynamic分配的networking端口。 防火墙(如iptables)将阻止这个。

linux上的tomcat解决scheme:

使用tomcat 6.0.24或更新的下载catalina-jmx-remote.jar从apache tomcat extras(在tomcat下载页面上使用浏览)将它复制到$ CTALINA_HOME \ lib

这使您可以设置JMX使用的两个端口

在server.xml中编辑服务器部分

 <Server port="8005" ..> ... <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/> 

设置一些环境variables(例如在setenv.sh中)

 CATALINA_OPTS=" -Djava.rmi.server.hostname=IP-TO-LISTEN -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access -Dcom.sun.management.jmxremote.ssl=false" 

这将激活JMX的访问控制

jmxremote.access将如下所示

 monitorRole readonly controlRole readwrite 

结束jmxremote.password即可

 monitorRole tomcat controlRole tomcat 

(只是简单的空间)

重启tomcat。

现在在服务器上configuration防火墙(例如iptables)

的/ etc / SYSCONFIG / iptables的

 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT 

和/ etc / sysconfig / ip6tables

 -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT 

重启iptables

完成!

现在在您的工作站上使用VisualVM或JConsolebuild立到我们示例中的rmiRegistryPortPlatform(9840)的连接。

如果工作站和服务器之间没有更多的防火墙,它应该工作。

尝试与Java 8

1.将此添加到您的Java Tomcat启动脚本中:

 -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 

例如添加到bin / setenv.sh中:

 export CATALINA_OPTS="$CATALINA_OPTS \ -Dcom.sun.management.jmxremote.port=1616 \ -Dcom.sun.management.jmxremote.rmi.port=1616 \ -Dcom.sun.management.jmxremote.local.only=true \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false " 

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将被转发到远程端。
  • PS2 .:您可以为JMX和RMI对话指定相同的端口

你使用什么string作为JMX连接url。 我不是故意指出显而易见的,但JConsole有一个可怕的界面,并且在我连接到远程jmx应用程序之前,需要一个过于复杂的url。 我看起来像这样:

 service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi 

在Tomcat8中启用JMX,在我的POC中成功testing

1 /从apache网站下载catalina-jmx-remote.jar并放入$CATALINA_HOME/lib

2 /以server.xml / setenv.sh备份。 像下面一样对server.xml进行更改 –

 <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /> 

3 /对$CATALINA_BASE/bin/setenv.sh进行更改,如 –

 [...] JVM_OPTS="[...] -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=true -Djava.rmi.server.hostname=<eth:0_IP>| <`hostname -i`> -Dcom.sun.management.jmxremote.password.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.access -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote=true " 

4 /创build这两个文件 – $touch $CATALINA_BASE/conf/jmxremote.password包含:

pipe理员letmein

$touch $CATALINA_BASE/conf/jmxremote.access包含:

pipe理员阅读

 $ chmod 600 jmxremote.password 

5 /重新启动tomcat并在jconsole工具上testing:)

 $echo|telnet 10.105.14.90 10001 

当你说“但不能成功连接”时,你的意思是什么? 是否有错误讯息? 尝试启用jconsole中的日志logging,看看是否有助于debugging。

要打开jconsole日志logging,在要运行jconsole的目录中编辑名为logging.properties的文件,请添加:

 handlers= java.util.logging.ConsoleHandler .level=INFO java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter java.util.logging.ConsoleHandler.level = FINEST java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter javax.management.level=FINEST javax.management.remote.level=FINEST 

然后,启动jconsole:

 jconsole -J-Djava.util.logging.config.file=logging.properties 

如果您正在使用linux,请修改catalina.sh文件,并添加:

  CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<HOST_IP> -Dcom.sun.management.jmxremote.port=<HOST_PORT> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" export CATALINA_OPTS 

或者以root用户身份修改/ etc / profile文件并重新运行文件(source / etc / profile)

如果您正在使用Windows,并从命令行启动tomcat,请使用环境variablesCATALINA_OPTS

如果您正在使用Windows,并且将tomcat作为服务启动,则需要使用monitor service实用程序来configuration服务初始化参数(setenv.bat,catalina.bat或env-vars都不起作用)。 为此,您需要显示在services.msc中列出的服务名称(例如jasperreportsTomcat)。 之后,您需要以pipe理员身份打开控制台并执行(例如):tomcat6w.exe // MS // jasperreportsTomcat

使用此命令将显示一个托盘图标,您可以在其中打开面板。 现在在“Java”选项卡中,您可以修改jmx选项。 注意不要添加尾随的空格,并使用“[enter]”符号来逐行分隔每个选项。

 -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.61.101 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 

希望它有帮助

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

添加行{tomcat_dir} /bin/setenv.sh:

 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" 

为了完成这件事情的调查,我得到了你们所有的人。 有一个技巧,碰巧profiler工具使用端口与jvm连接,但是jvm使用另一个随机端口继续对话。 如果jvm在远程机器(例如:tomcat web-app服务器)内运行,并且远程计算机具有防止传出和传入连接的保护,则必须设置java系统属性com.sun.management.jmxremote.rmi.port转换为名为com.sun.management.jmxremote.port的属性的相同值

来源: https ://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error并检查了这一点: http://blog.cantremember的.com /debugging与- JConsole的-JMX的SSH-隧道/

希望贡献一个家伙!

还有祝你好运!

那么,我有一个Linux的盒子(虚拟机)这个问题,我使用-Djava.rmi.server.hostname属性解决它,但有一件事我不明白。 我的机器有5个tomcat服务器,它们都在连续的端口(8008,8018,8028 …)中启用了jmx,并且只有其中一个连接了JMX。 没有防火墙,没有-Djava.rmi.server.hostname属性在任何tomcat ….

所以事情是我明白了这个问题,但是我不明白为什么我的4个tomcats工作,其中一个没有。

PD:我知道,我的英语很差。 我很抱歉。

PROTIP:您需要修复RMIregistry和JMX / RMI服务器端口(如具有已知号码)。 您可以通过将jar文件放在lib-dir中并configuration一个特殊的侦听器来实现这一点。 (当然,通常的标志为激活JMX

  -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=8999 \ -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远程生命周期监听器

更改linux上的/etc/hosts ,在那里我把与我的帐户关联的本地主机地址replace为机器ip,为我解决了这个问题。