情景很简单。我试图从我的本地工作站(Mac OS 10.9)监视运行 Tomcat 7.0的远程服务器(Ubuntu 12.04)。 54 我部署了 Spring Java 应用程序。
JVM热点64位" 1.7.0_51" 用于服务器和工作站。
配置Tomcat的JmxRemoteLifecycleListener以修复端口(server.xml)
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
rmiRegistryPortPlatform="9940" rmiServerPortPlatform="9941" />
将 catalina-jmx-remote.jar 复制到CATALINA_HOME / lib
打开端口 sudo iptables -L
ACCEPT tcp -- anywhere anywhere tcp dpt:9940
ACCEPT tcp -- anywhere anywhere tcp dpt:9941
setenv.sh
IP=`ifconfig eth0 | grep 'inet '| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`;
export CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.local.only=false
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.authenticate=true
-Djava.rmi.server.hostname=$IP
-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"
IP被解析为托管的内部IP地址,比如10.239.94.133。
启动Tomcat并检查 netstat -nap | grep java
tcp6 0 0 :::9940 :::* LISTEN 6538/java
tcp6 0 0 :::9941 :::* LISTEN 6538/java
到目前为止,这一切似乎表明设置是正确的。我可以将我的远程主机telnet到两个端口,我可以看到Tomcat(6538)正在监听这些端口。
从我的本地主机 jconsole -debug 连接到远程进程
service:jmx:rmi://PUBLIC-IP:9941/jndi/rmi://PUBLIC-IP:9940/jmxrmi
java.lang.SecurityException: Expecting a javax.rmi.ssl.SslRMIClientSocketFactory RMI client socket factory in stub!
at javax.management.remote.rmi.RMIConnector.checkStub(RMIConnector.java:1881)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:295)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:268)
at sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient.java:370)
at sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:313)
at sun.tools.jconsole.VMPanel$2.run(VMPanel.java:292)
有什么我错过的吗?我正在用这个圈子跑: - /感谢你的帮助。
答案 0 :(得分:3)
IP被解析为主机的内部IP地址,比如10.239.94.133。
这就是问题所在。修复实际上是设置
-Djava.rmi.server.hostname=server.public.ip.address
你仍然在JConsole中得到相同的错误(使用-debug选项)但忽略它并点击'insecure'按钮继续你的所在:)