Tomcat 6、JMX和动态端口问题

11
阅读并尝试了很多后,我不得不问是否有人有解决我的问题的方法。我正在尝试在防火墙后设置一些Tomcat(V6)。这不是什么大问题 - 但我想通过JMX监视它们。我阅读了TC文档,并遇到了JMXRemoteLifecycleListener。我的测试TC安装设置与上面链接中所述的完全相同。因此,我无法从我们网络中的一个主机连接到另一个主机。此外,每次启动TC时会打开第三个随机端口。在我的server.xml中,监听器已被激活。
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
rmiRegistryPortPlatform="8050" rmiServerPortPlatform="8060" />
显示一切正常。
2011-06-14 16:46:48,819 [main] INFO org.apache.catalina.mbeans.JmxRemoteLifecycleListener-
The JMX Remote Listener has configured the registry on port 8050 and the server on port 8060 for the Platform server

端口已经打开,我可以从任何其他主机通过telnet连接它们。我能够使用以下方式本地连接到vm (service:jmx:rmi://<hostname>:8xxx/jndi/rmi://<hostname>:8xxxx/jmxrmi)。
Netstats输出如下:
tcp6       0      0 :::8080                 :::*                    LISTEN      11291/java
tcp6       0      0 :::8050                 :::*                    LISTEN      11291/java
tcp6       0      0 :::8060                 :::*                    LISTEN      11291/java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      11291/java
tcp6       0      0 :::60901                :::*                    LISTEN      11291/java
tcp6       0      0 127.0.0.1:8009          :::*                    LISTEN      11291/java

即使使用了所有必要的VM选项,Tomcat也会启动。

CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=TRUE 
-Dcom.sun.management.jmxremote.password.file=$CATALINA_HOME/conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=$CATALINA_HOME/conf/jmxremote.access"

有人知道我为什么卡在这里吗?提前感谢!


尝试在VM选项中设置端口。看起来你在Cat opts的第一行缺失了这个参数:-Dcom.sun.management.jmxremote.port=8086。 - Keibosh
@Keibosh 关于文档,如果您正在使用TC监听器,则应避免使用此选项。即使使用此选项,它也无法正常工作。 - Martin Röbert
1
注意了,第一次看得太快了。如果在本地这些端口上运行没有问题,你可能会遇到这个问题。http://olegz.wordpress.com/2009/03/23/jmx-connectivity-through-the-firewall/ 在文章的中间部分,他讨论了将私有地址推送给客户端而不是公共地址的问题。 - Keibosh
非常感谢,通过将“-Djava.rmi.server.hostname = IP”放在我的启动脚本中,它起作用了 :) 但是,是否可能自动化地在TC中完成这项工作?对于一堆实例来说,这有点烦人... - Martin Röbert
2个回答

14

答案是在通用 JMX 选项中添加 -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx

以下是自动设置主机名的示例:

IP=`ifconfig eth0  | grep 'inet '| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'``;

CATALINA_OPTS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=TRUE
-Dcom.sun.management.jmxremote.password.file=$CATALINA_HOME/conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=$CATALINA_HOME/conf/jmxremote.access
-Djava.rmi.server.hostname=$IP"

3
问题可能是启用jmx监控时Java本身打开的第二个随机端口。从Java 7开始,该端口也可以设置:

-Dcom.sun.management.jmxremote.rmi.port=7091

因此,可以组合使用-使用相同的端口:

-Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.rmi.port=7091

这就是我的问题的解决方案。一旦将端口设置为固定数字,就可以轻松地在防火墙中设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接