56

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

12 回答 12

63

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

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

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

JAVA_OPTS一样,然后它就起作用了。

于 2009-08-19T14:49:04.233 回答
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 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。

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

于 2011-07-21T20:26:23.340 回答
13

尝试使用 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 对话指定相同的端口
于 2015-11-24T12:36:04.370 回答
8

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

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi
于 2010-05-19T20:49:21.447 回答
3

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

1/catalina-jmx-remote.jar 从 apache 网站下载并放入$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/ 创建这两个文件 - $touch $CATALINA_BASE/conf/jmxremote.password包含:

管理员让我

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

管理员读写

$ chmod 600 jmxremote.password

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

$echo|telnet 10.105.14.90 10001
于 2016-02-24T11:30:06.120 回答
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
于 2009-08-12T23:24:31.400 回答
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文件并重新运行该文件(源/etc/profile)

如果您在 Windows 上工作并且从命令行启动 tomcat,请使用环境变量 CATALINA_OPTS

如果您在 Windows 上工作并且将 Tomcat 作为服务启动,则需要使用监控服务实用程序来配置服务初始化参数(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

希望能帮助到你

于 2013-10-11T14:52:18.683 回答
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/

希望各位大侠贡献!

还有祝你好运!

于 2014-12-10T19:36:08.147 回答
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"
于 2015-06-04T06:40:35.527 回答
0

Changing the /etc/hosts on linux, where I replaced the localhost address associated to my account to the machine ip, solved this problem for me.

于 2011-03-11T18:13:07.003 回答
0

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

所以问题是我理解这个问题,但我不明白为什么我的 4 个 tomcat 工作而其中 1 个没有工作。

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

于 2011-11-17T09:12:05.487 回答
0

提示:您需要修复(如拥有已知编号)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 远程生命周期侦听器

于 2013-10-11T09:44:29.950 回答