我正在尝试使用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"
答案 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)
-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 "
Windows用户:
putty.exe -ssh user@remote-host -L 1616:remote-host:1616
Linux和Mac用户:
ssh user@remote-host -L 1616:remote-host:1616
jconsole
jconsole localhost:1616
ssh
和-L
指定将本地(客户端)主机上的端口1616转发到远程端。答案 3 :(得分:8)
您使用什么字符串作为JMX连接URL。我并不是要指出明显但JConsole有一个糟糕的界面,对我来说需要一个过于复杂的URL才能连接到远程jmx应用程序。我看起来像这样:
service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi
答案 4 :(得分:3)
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远程生命周期监听器