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


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

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

  • com.солнце.управление.jmxremote
  • com.солнце.управление.jmxremote.порт=1088
  • com.солнце.управление.jmxremote.проверка подлинности=ложь
  • com.солнце.управление.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-битным, ни работа.

11 82

11 ответов:

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

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

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

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

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

убедитесь, что следующая команда возвращает вам реальный IP или имя хоста. Если он возвращает что-то вроде 127.0.0.1, 127.0.1.1 или localhost, он не будет работать, и вам придется обновить .

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 возвращает.

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

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

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

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

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

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

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

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

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

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

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

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 отображается сообщение об ошибке подключения. Я выполнил захват wireshark, и он показывает обмен данными, поступающий как от агента, так и от jconsole.

таким образом, это не сетевая проблема, если я выполняю netstat-an С или без java.РМО.сервер.имя хоста системное свойство, у меня есть следующие привязки:

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

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

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

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

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

java -Джава.РМО.сервер.имя хоста=ХХХ.ХХХ.ХХХ.ХХХ - Dcom.солнце.управление.jmxremote-Dcom.солнце.управление.jmxremote.ssl=false-Dcom.солнце.управление.jmxremote.authenticate=false-Dcom.солнце.управление.jmxremote.порт=25000-jar myjar.банку

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

cat / 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

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

чтобы включить JMX remote, передайте ниже параметры виртуальной машины вместе с командой 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

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

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

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