Віддалене підключення JMX


96

Я намагаюся відкрити підключення 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-розрядними, жоден з них не працює.


1
Ймовірно , пов'язане з stackoverflow.com/questions/151238 / ...
tuler

Ось детальний посібник stackoverflow.com/a/11654322/99834
Sorin

Відповіді:


117

Якби це було в Linux, проблема полягала б у тому, що localhost є інтерфейсом зворотного зв'язку , вам потрібно застосувати програму для прив'язки до вашого мережевого інтерфейсу .

Ви можете використовувати netstat, щоб підтвердити, що він не прив'язаний до очікуваного мережевого інтерфейсу.

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

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

7
Не забувайте про це hostname -i, див. Stackoverflow.com/a/11654322/99834 для деталей.
sorin

Працювали! У нашому середовищі ми використовуємо віртуальні машини VMWare. Сервер знаходився на віртуальній машині. Віртуальна машина була розгорнута огородженою, тому вона має внутрішню та зовнішню IP-адреси. Ми розпочали процес Java-сервера з -Djava.rmi.server.hostname = <зовнішня-адреса>.
buzz3791

Для встановлення ip хоста або зміни localhost ip це посилання було б корисним.
Reza Ameri

У мене тут є два запитання - 1) Що робити, якщо хтось хоче використовувати JMXMP, а не JMX. Які б були налаштування для цього? і 2) Чи можна встановити з'єднання JMX без завантаження протоколу RMI?
Кумар Вайбхав,

64

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

Переконайтеся, що наступна команда повертає вам справжній IP або ІМЯ ХОСТА. Якщо він повертає щось на зразок 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повертається.

Очевидно, ви повинні бути впевнені, що брандмауер не блокує вас, але я майже впевнений, що це не ваша проблема, проблема полягає в останньому параметрі, який не задокументовано.


Додавши -Djava.rmi.server.hostname = myserver.example.com зробив свою справу! Дякую!
Джим Бетанкур,

Я дозволив собі відкрити для цього помилки в документах JDK: bugs.openjdk.java.net/browse/JDK-8066405
Клара,

2
"Переконайтеся, що наступна команда повертає вам справжній IP або HOSTNAME. Якщо він повертає щось на зразок 127.0.0.1, 127.0.1.1 або localhost, це не буде працювати, і вам доведеться оновити файл / etc / hosts." Що?
PedroD

1
Просто швидко немає, java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>. Сподіваюся, що це комусь допоможе.
Sonny

24

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

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

Також див. Чому Java відкриває 3 порти, коли налаштовано JMX?


12

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

Якщо ви намагаєтеся отримати доступ до сервера, який знаходиться позаду NAT - вам, швидше за все, доведеться запустити свій сервер з опцією

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

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


8

здається, що ваша кінцева цитата надходить занадто рано. Це має бути після останнього параметра.

Цей фокус спрацював у мене.

Я помітив щось цікаве: коли я запускаю свою програму за допомогою наступного командного рядка:

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.rmi.server.hostname або без неї, у мене є такі прив'язки:

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

Це означає, що в обох випадках сокет, створений на порту 9999, приймає з'єднання з будь-якого хоста за будь-якою адресою.

Я думаю, що вміст цієї системної властивості використовується десь при підключенні та порівнюється з фактичною IP-адресою, що використовується агентом для зв'язку з jconsole. І якщо ці адреси не збігаються, з’єднання не вдається.

У мене не було цієї проблеми під час підключення з одного хосту за допомогою jconsole, лише від реальних фізичних віддалених хостів. Отже, я припускаю, що ця перевірка проводиться лише тоді, коли підключення надходить ззовні.


Що ви маєте на увазі під "ваша кінцева цитата надто рано"? У мене така сама проблема, я бачу, як встановлюється TCP-з'єднання, але врешті-решт jconsole заявляє, що не вдалося підключитися.
цуна

Не знаю, якщо я добре пам’ятаю, десь була відкрита цитата, і ця цитата не була в кінці параметрів. Можливо, це було в пакетному сценарії, я не пам’ятаю. Але мушу визнати, що ця відповідь не має сенсу щодо питання ... Може, питання було відредаговано? Немає відредагованого повідомлення під питанням ... Не знаю, вибачте.
yohann.martineau

6

для мене працювало те, що встановив / 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

5

Велике спасибі, це працює так:

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



0

У мене така сама проблема, і я змінюю будь-яке ім'я хосту, яке відповідає імені локального хосту, на 0.0.0.0, здається, це працює після того, як я це роблю.


0

Щоб увімкнути віддалений JMX, передайте нижче параметрів VM разом із командою 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

1
Чи можете ви сказати мені, чому це прив'язка до 0.0.0.0, а не до певної IP-адреси?
Бабу Джеймс

0

Спробуйте це, я протестував доступ до 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 localhost: 16000


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.