【问题标题】:Connecting remote tomcat JMX instance using jConsole使用 jConsole 连接远程 tomcat JMX 实例
【发布时间】:2010-11-18 20:06:02
【问题描述】:

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

【问题讨论】:

标签: java tomcat jmx jconsole


【解决方案1】:

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

RMI 服务器似乎没有在正确的 ip 上侦听。所以,正如this related question 中所建议的,我添加了以下内容:

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

也发送到JAVA_OPTS,然后就成功了。

【讨论】:

  • 为我工作我只是将主机 ip 设置为 127.0.0.1,它在我的本地机器上为我工作。
  • 我们是添加到服务器的 JAVA_OPTS 还是本地机器的 JAVA_OPTS 中?
  • 太好了,我在使用 JMX 监控远程 ActiveMQ 时遇到了同样的问题。这解决了它。非常感谢。
  • 对我不起作用。我有 LAS-tomcat。我认为设置可能不同
【解决方案2】:

我收集了遍布网络的信息,并在其他成员的提示下找到。

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。

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

【讨论】:

  • +1 谢谢!工作得很好!我只需要再添加一行:-Djava.rmi.server.hostname=&lt;server-name&gt;.
  • 在tomcat.conf 中也应该是-Dcom.sun.management.jmxremote.port=9840 吗?
  • 我明白了 - 监听器负责端口。但是在这个例子中你使用什么连接字符串呢?
  • @NicholasTolleyCottrell : 连接字符串类似于 monitorRole@IP-TO-LISTEN:9840 或 service:jmx.rmi:///jndi/rmi/IP-TO-LISTEN:9840
  • @NicholasTolleyCottrell :我们不必使用参数设置端口。它是通过 server.xml 中的侦听器配置完成的
【解决方案3】:

用 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 对话指定相同的端口

【讨论】:

  • 感谢能够在同一个端口上运行 rmiregistry 和 rmcomm。这在没有 tomcat/conf/server.xml JMXRemoteLifecycleListener 的情况下工作。如果不使用该监听器,是否有任何问题需要注意?
  • @Whome 对不起,我错过了你的评论。不,根据我的经验,没有相反的迹象。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    在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 like -

    [...]
    
    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
    

    【讨论】:

      【解决方案6】:

      当您说“但无法成功连接。”时,您到底是什么意思?有错误信息吗?尝试打开 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
      

      【讨论】:

      • 乔,我遇到了以下异常。忽略日志记录错误提示 com.sun.jmx.remote.util.ClassLogger.trace(ClassLogger.java:88) 的 com.sun.jmx.remote.util.ClassLogger.finer(ClassLogger.java:130) 的问题是什么javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:245) 在 javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:227) 在 sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient. java:334) 在 sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:296) 在 sun.tools.jconsole.VMPanel$2.run(VMPanel.java:280)
      • 抱歉,我在 logging.properties 文本中有错字。我编辑了我的帖子,尝试再次制作该文件,看看是否可以获得一些调试信息。
      • 不,我们看不到日志。这在哪里创建了日志?
      【解决方案7】:

      如果你在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
      

      希望对你有帮助

      【讨论】:

        【解决方案8】:

        检查您的服务器是否位于防火墙后面。 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】:

          我为你们所有人准备了一些东西,以完成对整个事情的调查。有一个技巧,探查器工具使用端口与 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/

          希望为大家做出贡献!

          祝你好运!

          【讨论】:

            【解决方案10】:

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

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

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

            【讨论】:

              【解决方案11】:

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

              请参阅:JMX 远程生命周期侦听器http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

              【讨论】:

                【解决方案12】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-08-01
                  • 2017-02-15
                  • 1970-01-01
                  • 2011-04-21
                  • 2010-10-24
                  • 2016-11-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多