Java JMX拒绝连接非常奇怪的情况

时间:2014-02-06 13:54:30

标签: java tomcat rmi jmx

我确实在某些服务器上启用JMX时遇到了一致的问题。似乎虽然这对某些人起作用,但其中一些人却以一种奇怪的方式拒绝连接。

端口打开,我可以从localhost或其他主机telnet到它。

以下是我尝试连接到其中一个有问题的时候从jmxterm获得的内容。

如果打开端口会发生这种情况:

$>open 10.80.16.195:8091
#RuntimeIOException: Runtime IO exception: Connection refused to host: 127.0.0.1; nested exception is:
    java.net.ConnectException: Connection refused

如果端口真的关闭,就会发生这种情况:

$>open 10.80.16.195:9999
#RuntimeIOException: Runtime IO exception: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 10.80.16.195; nested exception is:
    java.net.ConnectException: Connection refused]

以下是用于连接以启动JVM(tomcat)的参数: /usr/lib/jvm/java-7-oracle/bin/java -Djava.awt.headless=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8091 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.80.16.195 -classpath /opt/Confluence.5/bin/bootstrap.jar -Dcatalina.base=/opt/Confluence.5 -Dcatalina.home=/opt/Confluence.5 org.apache.catalina.startup.Bootstrap start

java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

我观察到其他人的类似抱怨,但没有人提供明确的原因。它不太可能成为JMX客户端,因为我使用了3-4个,并且似乎都有类似的行为,与某些服务器一起工作并且在其他服务器上失败。

我知道/etc/hosts可能与此相关联,因为我记得在某些情况下报告了127.0.1.1并且我确实知道Debian机器确实有此设置。

127.0.0.1 localhost
127.0.0.1 dowa-01.my.domain.com dowa-01
# by default the previous line had 127.0.1.1 instead and this was causing problems with JMX    

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

正如您可能观察到的那样,JMX被绑定到机器的可路由地址,这是因为如果您手动指定IP,这是允许来自外部的连接的唯一方法。

现在问题是什么?

2 个答案:

答案 0 :(得分:3)

在服务器上的/ etc / hosts中,我将替换此行:

127.0.0.1 dowa-01.my.domain.com dowa-01

有了这个:

10.80.16.195 dowa-01.my.domain.com dowa-01

服务器上的JVM将尝试解析localhost的IP地址并获取127.0.0.1。我的猜测是,JMX只接受127.0.0.1上的远程连接,这会导致问题。相反,您希望Java识别真正的IP并听取它。

答案 1 :(得分:1)

此问题的原因是您必须手动指定计算机的公共IP,否则JMX / RMI将无法正确绑定。

IP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')
# if we have several IPs found, we pick the first one
for IP in $IP
do
  break
  done
java .... -Djava.rmi.server.hostname=${IP}