使用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,为我解决了这个问题。