使用jConsole连接远程tomcat JMX实例

时间:2009-08-12 02:58:51

标签: java tomcat jmx jconsole

我正在尝试使用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"

12 个答案:

答案 0 :(得分:63)

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

看来RMI服务器没有正在侦听正确的ip。因此,正如this related question中所建议的那样,我添加了以下内容:

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

JAVA_OPTS,然后就可以了。

答案 1 :(得分:36)

我收集了通过网络传播的信息,并附有其他成员的提示。

JMX引起的大多数痛苦是(imo)JMX打开第二个动态分配的网络端口这一事实。防火墙(如iptables)会阻止它。

linux上tomcat的解决方案:

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

这允许您设置JMX使用的两个端口

编辑server.xml中的Server部分

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

设置一些环境变量(例如在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。

现在在服务器上配置防火墙(例如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或JConsole在我们的示例中建立与rmiRegistryPortPlatform,9840的连接。

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

答案 2 :(得分:11)

尝试使用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。玩得开心!

  • P.S。:在步骤2中,使用ssh-L指定将本地(客户端)主机上的端口1616转发到远程端。
  • P.S.2。:您可以为JMX和RMI对话指定相同的端口

答案 3 :(得分:8)

您使用什么字符串作为JMX连接URL。我并不是要指出明显但JConsole有一个糟糕的界面,对我来说需要一个过于复杂的URL才能连接到远程jmx应用程序。我看起来像这样:

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

答案 4 :(得分:3)

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

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 - < - p>

[...]

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 /创建这两个文件为 - $touch $CATALINA_BASE/conf/jmxremote.password包含:

  

admin letmein

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

  

admin readwrite

$ chmod 600 jmxremote.password

5 /重启tomcat并在jconsole工具上测试:)

$echo|telnet 10.105.14.90 10001

答案 5 :(得分:2)

当您说“但无法成功连接”时,您究竟是什么意思?有错误信息吗?尝试打开登录jconsole,看看是否有助于调试它。

要打开jconsole日志记录,请在您将运行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

答案 6 :(得分:2)

如果您正在使用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,请使用  环境变量CATALINA_OPTS

如果您正在使用Windows并且您正在启动tomcat作为服务,则需要使用monitor service实用程序来配置服务初始化参数(setenv.bat,catalina.bat或env-vars都不起作用) 。为此,您需要出现在services.msc中列出的服务名称(例如jasperreportsTomcat)。之后,您需要以管理员身份打开控制台并执行(例如):   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

希望有所帮助

答案 7 :(得分:1)

我为你们所有人提供了一些东西,以便完成对这件事的调查。有一个技巧,它发生了探查器工具使用端口与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-with-jconsole-jmx-ssh-tunnels/

希望有所贡献!

祝你好运!

答案 8 :(得分:1)

检查您的服务器是否在防火墙后面。 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"

答案 9 :(得分:0)

更改linux上的/etc/hosts,我将与我的帐户关联的本地主机地址替换为机器ip,为我解决了这个问题。

答案 10 :(得分:0)

好吧,我在Linux机器盒(虚拟机)中遇到了这个问题,我使用-Djava.rmi.server.hostname属性修复了它,但有一件事我无法理解。我的机器有5个tomcat服务器,所有这些服务器都在连续端口(8008,8018,8028 ...)中启用了jmx,并且只有其中一个服务器连接JMX时遇到此问题。在任何tomcat中都没有防火墙,没有-Djava.rmi.server.hostname属性....

所以问题是我理解了这个问题,但我无法理解为什么我的4只猫咪在工作,其中1只没有。

P.D:我知道,我的英语很差。我的道歉。

答案 11 :(得分:0)

PROTIP:您需要修复(如具有已知编号)RMI注册表和JMX / RMI服务器端口。您可以通过将jar文件放在lib-dir中并配置特殊的侦听器来完成此操作。 (当然是激活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远程生命周期监听器