Удаленное соединение JMX

Я пытаюсь открыть JMX-соединение с Java-приложением, запущенным на удаленном компьютере.

В JVM приложения настроены следующие параметры:

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port = 1088
  • com.sun.management.jmxremote.authenticate = false
  • com.sun.management.jmxremote.ssl = false

Я могу подключиться с помощью localhost:1088, используя jconsole или jvisualvm. Но я не могу подключиться с помощью xxx.xxx.xxx.xxx:1088 с удаленного компьютера.

Между серверами и ОС нет брандмауэра. Но чтобы исключить эту возможность, я telnet xxx.xxx.xxx.xxx 1088 и думаю, что он подключается, так как экран консоли становится пустым.

Оба сервера - Windows Server 2008 x64. Пробовал с 64-битной JVM и 32-битной, ничего не работает.


person tuler    schedule 07.05.2009    source источник
comment
Вероятно, связано с stackoverflow.com/questions/151238/   -  person tuler    schedule 07.05.2009
comment
Вот подробное руководство stackoverflow.com/a/11654322/99834   -  person sorin    schedule 25.07.2012


Ответы (12)


Если бы это было в Linux, проблема была бы в том, что localhost является интерфейсом обратной связи, вам нужно, чтобы приложение было привязано к вашему сетевому интерфейсу.

Вы можете использовать netstat, чтобы подтвердить, что он не привязан к ожидаемому сетевому интерфейсу.

Вы можете выполнить эту работу, вызвав программу с системным параметром java.rmi.server.hostname="YOUR_IP", либо как переменную среды, либо используя

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
person takete.dk    schedule 07.05.2009
comment
Не забывайте о hostname -i, подробнее см. stackoverflow.com/a/11654322/99834. - person sorin; 25.07.2012
comment
Работал! В нашей среде мы используем виртуальные машины VMWare. Сервер был на виртуальной машине. Виртуальная машина была развернута изолированной, поэтому у нее есть внутренний и внешний IP-адреса. Мы запустили серверный Java-процесс с -Djava.rmi.server.hostname = ‹external-ip-address›. - person buzz3791; 29.10.2013
comment
Эта ссылка может быть полезна для установки IP-адреса хоста или изменения IP-адреса локального хоста. - person Reza Ameri; 28.04.2014
comment
У меня есть два вопроса: 1) Что делать, если кто-то хочет использовать JMXMP, а не JMX. Какие бы конфиги для этого? и 2) Можно ли установить соединение JMX без загрузки протокола RMI? - person Kumar Vaibhav; 17.02.2015

Я потратил больше дня, пытаясь заставить JMX работать вне localhost. Похоже, что SUN / Oracle не смогли предоставить хорошую документацию по этому поводу.

Убедитесь, что следующая команда вернет вам реальный IP-адрес или HOSTNAME. Если он вернет что-то вроде 127.0.0.1, 127.0.1.1 или localhost, он не будет работать, и вам придется обновить /etc/hosts файл.

hostname -i

Вот команда, необходимая для включения JMX даже извне

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

Где, как вы предполагали, myserver.example.com должен соответствовать тому, что возвращает hostname -i.

Очевидно, вы должны быть уверены, что брандмауэр не блокирует вас, но я почти уверен, что это не ваша проблема, проблема заключается в последнем параметре, который не задокументирован.

person sorin    schedule 25.07.2012
comment
Добавление -Djava.rmi.server.hostname = myserver.example.com помогло! Спасибо! - person Jim Bethancourt; 04.04.2014
comment
Я взял на себя смелость открыть для этого JDK docs: bugs.openjdk.java.net / browse / JDK-8066405 - person Klara; 02.12.2014
comment
Убедитесь, что следующая команда вернет вам реальный IP-адрес или HOSTNAME. Если он вернет что-то вроде 127.0.0.1, 127.0.1.1 или localhost, он не будет работать, и вам придется обновить файл / etc / hosts. Какие? - person PedroD; 07.05.2015
comment
Просто нет, java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>. Надеюсь, это кому-то поможет. - person Sonny; 15.02.2016
comment
@PedroD: Вам необходимо войти в / etx / hosts с вашим общедоступным IP-адресом и именем хоста, которое вы используете для -Djava.rmi.server.hostname - person Sebastian; 14.10.2020

В моем тестировании с Tomcat и Java 8 JVM открывала эфемерный порт в дополнение к порту, указанному для JMX. Следующий код исправил меня; попробуйте, если у вас возникли проблемы, когда ваш JMX-клиент (например, VisualVM не подключается.

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

Также см. Почему Java открывает 3 порта, когда JMX настроен?

person LeslieM    schedule 05.10.2016

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

Если вы пытаетесь получить доступ к серверу, который находится за NAT, вам, скорее всего, придется запустить свой сервер с опцией

-Djava.rmi.server.hostname=<public/NAT address>

так что заглушки RMI, отправляемые клиенту, содержат общедоступный адрес сервера, позволяющий клиентам получить к нему доступ извне.

person h0nIg    schedule 08.09.2011

похоже, что ваша финальная цитата идет слишком рано. Он должен быть после последнего параметра.

У меня этот трюк сработал.

Я заметил кое-что интересное: когда я запускаю свое приложение, используя следующую командную строку:

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

Если я попытаюсь подключиться к этому порту с удаленного компьютера с помощью jconsole, TCP-соединение будет успешным, некоторые данные будут обмениваться между удаленной jconsole и локальным jmx-агентом, где развернут мой MBean, а затем jconsole отобразит сообщение об ошибке подключения. Я выполнил захват Wirehark, и он показывает, что обмен данными происходит как от агента, так и от jconsole.

Таким образом, это не проблема сети, если я выполняю netstat -an с системным свойством java.rmi.server.hostname или без него, у меня будут следующие привязки:

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

Это означает, что в обоих случаях сокет, созданный на порту 9999, принимает соединения с любого хоста по любому адресу.

Я думаю, что содержимое этого системного свойства используется где-то при подключении и сравнивается с фактическим IP-адресом, используемым агентом для связи с jconsole. И если эти адреса не совпадают, соединение не устанавливается.

У меня не было этой проблемы при подключении с одного и того же хоста с помощью jconsole, только с реальных физических удаленных хостов. Итак, я предполагаю, что эта проверка выполняется только тогда, когда соединение идет "извне".

person yohann.martineau    schedule 18.06.2010
comment
Что вы имеете в виду, говоря, что ваша финальная цитата приходит слишком рано? У меня та же проблема, я вижу, что устанавливается TCP-соединение, но в конечном итоге jconsole утверждает, что не удалось подключиться. - person tsuna; 04.04.2013
comment
Не знаю, если я правильно помню, где-то была открытая цитата, и этой цитаты не было в конце параметров. Может быть, это был пакетный сценарий, я не могу вспомнить. Но я должен признать, что этот ответ не имеет смысла по поводу вопроса ... Может быть, вопрос отредактировали? Нет отредактированного уведомления под вопросом ... Не знаю, извините. - person yohann.martineau; 05.04.2013

у меня сработало то, что я установил / etc / hosts, чтобы указать имя хоста на ip, а не на интерфейс обратной связи, а затем перезапустить мое приложение.

кошка / etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

Это моя конфигурация:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false
person Maoz Zadok    schedule 02.12.2014

Большое спасибо, это работает так:

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.port = 25000 -jar myjar .jar

person user3406690    schedule 11.03.2014

Я знаю, что эта ветка довольно старая, но есть дополнительная опция, которая очень поможет. См. Здесь: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/

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

person Jonathan S. Fisher    schedule 18.09.2018

У меня такая же проблема, и я меняю любое имя хоста, которое соответствует имени локального хоста, на 0.0.0.0, похоже, после этого оно работает.

person ianpojman    schedule 10.05.2012

Чтобы включить удаленный JMX, передайте параметры виртуальной машины вместе с командой JAVA.

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in
person Ajay Kumar    schedule 04.12.2017
comment
Можете ли вы сказать мне, почему он привязан к 0.0.0.0, а не к конкретному IP? - person Babu James; 18.04.2018

Попробуйте это, я тестировал доступ к JMX внутри контейнера докеров

-Dcom.sun.management.jmxremote = true -Djava.rmi.server.hostname = localhost -Dcom.sun.management.jmxremote.port = 16000 -Dcom.sun.management.jmxremote.rmi.port = 16000 -Dcom.sun .management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false

потом

Локальный хост $ jconsole: 16000

person Emmerson    schedule 29.05.2020

Попробуйте использовать порты выше 3000.

person darko.topolsek    schedule 07.05.2009