我正在尝试在 Java 进程上设置远程 JMX 监控。以下是我提供给 JVM 的启动选项:
JAVA_OPTS="-server -Xms1G -Xmx1G -XX:MaxPermSize=512m "
JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=57011 -Dcom.sun.management.jmxremote.authenticate=false"
JMX_OPTS="$JMX_OPTS -Dcom.sun.management.jmxremote.ssl=false -Dfoo.jmx=true -Dfoo.jmx.detailed=true"
JMX_OPTS="$JMX_OPTS -Djava.rmi.server.host=192.168.9.121"
LOG_OPTS="-Dfoo.logging.type=log4j -DLOGDIR=${SERVERDIR}/logs"
ASD_OPTS="-Dfoo.conf.file=file:${PROPFILE} -cp ${CLASSPATH} foo"
/usr/bin/nohup ${JAVA_EXE} $JAVA_OPTS $JMX_OPTS $LOG_OPTS $ASD_OPTS 1>${SERVERDIR}/service.log 2>&1 &
我可以在本地使用 Jconsole 进行连接,但是当我从远程主机连接时,出现以下错误(为简洁起见,省略)
Java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: <snip>
因此,尽管明确声明要绑定到 192.168.9.121(-Djava.rmi.server.host),JMX 仍然绑定到远程系统的环回接口。
我发现的唯一解决方法是修改 /etc/hosts 以设置系统的 FQDN,如下所示:
127.0.0.1 localhost localhost.localdomain
192.168.9.121 my.servers.fqdn.com
基于我见过的每个 Linux 系统都有指向 127.0.0.1 的“my.servers.fqdn.com”这一事实,我只能想象改变这一点会带来奇怪的问题。
如果没有这个技巧,我怎样才能使远程 JMX 监控正常工作?
系统是CentOS 6、Java 1.6.0_35,防火墙已禁用,以供测试。
答案1
我确实遇到了这个问题...我使用了 tomcat 9.0.19 和 centos7 服务器...最后,我在其中添加了以下属性path/to/tomcat/bin/setenv.sh
:
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.1.20
-Djmx.rmi.registry.port=1099
-Djmx.rmi.port=1099
"
export CATALINA_OPTS
和重启你的 tomcat...
192.168.1.20 是我的本地服务器,1099 是我的 jmx 端口。这个配置对我有用。