У кого-нибудь когда-нибудь работала удаленная JMX JConsole? - PullRequest
110 голосов
/ 30 сентября 2008

Похоже, я никогда не получал эту работу в прошлом. В настоящее время я ЗНАЮ, что это не работает.

Но мы запускаем наш процесс Java:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Я могу telnet к порту, и «что-то есть» (то есть, если я не запускаю процесс, ничего не отвечает, но если я делаю, это делает), но я не могу заставить JConsole работать, заполняя в IP и порт.

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

Кто-нибудь знает совет по этому поводу?

Ответы [ 20 ]

122 голосов
/ 04 июля 2013

У меня есть решение для этого:

Если ваш Java-процесс выполняется в Linux за брандмауэром и вы хотите запустить JConsole / Java VisualVM / Java Mission Control в Windows на локальном компьютере, чтобы подключить его к JMX-порт вашего Java-процесса .

Вам необходим доступ к вашей машине с Linux через SSH. Все коммуникации будут проходить через SSH-соединение.

СОВЕТ: Это решение работает независимо от того, есть ли межсетевой экран или нет.

Недостаток: Каждый раз, когда вы перезагружаете ваш процесс Java, вам нужно будет снова выполнить все шаги с 4 - 9.


1. Вам нужен набор замазок для вашего компьютера с Windows здесь:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Как минимум putty.exe


2. Определите один свободный порт на вашем компьютере с Linux:

<jmx-remote-port>
* * Пример 1 042:
jmx-remote-port = 15666      


3. Добавьте аргументы в процесс Java на машине Linux

Это должно быть сделано именно так. Если это сделано, как показано ниже, это работает для Linux-машин за брандмауэрами (работает из-за аргумента -Djava.rmi.server.hostname=localhost).

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
* +1054 * Пример:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main


4. Получить идентификатор процесса вашего Java-процесса

ps -ef | grep <java-processname>

result ---> <process-id>
* * Пример тысяча шестьдесят три:
ps -ef | grep ch.sushicutta.jmxremote.Main

result ---> 24321


5. Найти произвольный порт для заглушек RMIServer

Процесс java открывает новый порт TCP на машине linux, где заглушки RMI Server будут доступны для загрузки. Этот порт также должен быть доступен через туннель SSH для подключения к виртуальной машине Java.

С помощью netstat -lp этот порт можно найти также, lsof -i дает подсказки, какой порт был открыт с помощью процесса Java.

ПРИМЕЧАНИЕ. Этот порт всегда изменяется при запуске процесса Java.

netstat -lp | grep <process-id>

tcp        0      0 *:<jmx-remote-port>     *:*     LISTEN      24321/java
tcp        0      0 *:<rmi-server-port>     *:*     LISTEN      24321/java


result ---> <rmi-server-port>

Пример: * * тысяча восемьдесят-три netstat -lp | grep 24321 tcp 0 0 *:15666 *:* LISTEN 24321/java tcp 0 0 *:37123 *:* LISTEN 24321/java result ---> 37123
6. Включите два SSH-туннеля с вашего компьютера Windows с помощью putty Source port: <jmx-remote-port> Destination: localhost:<jmx-remote-port> [x] Local [x] Auto Source port: <rmi-server-port> Destination: localhost:<rmi-server-port> [x] Local [x] Auto * * Пример тысяча девяносто-одина: * * один тысяча девяносто-дв Source port: 15666 Destination: localhost:15666 [x] Local [x] Auto Source port: 37123 Destination: localhost:37123 [x] Local [x] Auto
Settings to open an SSL tunnel via Putty
7. Войдите на свой компьютер Linux с Putty с включенным SSH-туннелем. Оставьте сеанс замазки открытым. Когда вы вошли в систему, Putty будет туннелировать все TCP-соединения к машине linux через SSH-порт 22. JMX-порт: Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666 RMIServer-Сто-порт: Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Запустите JConsole / Java VisualVM / Java Mission Control, чтобы подключиться к процессу Java, используя следующий URL-адрес Это работает, потому что JConsole / Java VisualVM / Java Mission Control считает, что вы подключаетесь к порту на вашей локальной машине Windows. но Putty отправляет всю полезную нагрузку на порт 15666 на ваш Linux-компьютер. Сначала на компьютере с Linux процесс Java дает ответ и отправляет обратно порт RMIServer. В этом примере 37123. Затем JConsole / Java VisualVM / Java Mission Control считает, что он подключается к localhost: 37123, и putty отправит всю полезную нагрузку на машину linux Java-процесс отвечает, и соединение открыто. [x] Remote Process: service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi * +1131 * Пример:

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi


Connect via jmx service url


9. НАСЛАЖДАЙТЕСЬ № 8 -]

79 голосов
/ 23 мая 2009

Добавление -Djava.rmi.server.hostname='<host ip>' решило эту проблему для меня.

46 голосов
/ 24 ноября 2015

Пробовал с Java 8

Это решение хорошо работает и с брандмауэрами

1. Добавьте это в свой скрипт запуска Java на удаленном хосте:

-Dcom.sun.management.jmxremote.port=1616
-Dcom.sun.management.jmxremote.rmi.port=1616
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

2. Выполните это на своем компьютере.

  • Пользователи Windows :

    putty.exe -ssh user@remote-host -L 1616:remote-host:1616

  • Пользователи Linux и Mac :

    ssh user@remote-host -L 1616:remote-host:1616

3. Запустите jconsole на вашем компьютере

jconsole localhost:1616

4. Веселись!

P.S .: на шаге 2, используя ssh и -L, вы указываете, что порт 1616 на локальном (клиентском) хосте должен быть перенаправлен на удаленную сторону. Это туннель ssh, помогающий избежать брандмауэров или различных проблем в сети.

19 голосов
/ 12 декабря 2008

Возможно, вы столкнулись с проблемой брандмауэра. Проблема заключается в том, что указанный вами порт - не единственный используемый порт, он использует 1 или, может быть, еще 2 порта для RMI, и они, вероятно, заблокированы брандмауэром.

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

Существует решение, которое не требует открытия большого количества портов, однако, я заставил его работать, используя объединенные исходные фрагменты и подсказки от

http://forums.sun.com/thread.jspa?threadID=5267091 - ссылка больше не работает

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

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

Можно даже настроить ssh-туннель и заставить его работать: -)

17 голосов
/ 16 декабря 2014

После проверки моего Google-фу в течение последних нескольких дней я наконец смог заставить это работать после компиляции ответов из Stack Overflow и этой страницы http://help.boomi.com/atomsphere/GUID-F787998C-53C8-4662-AA06-8B1D32F9D55B.html.

Репосты со страницы Dell Boomi:

To Enable Remote JMX on an Atom

If you want to monitor the status of an Atom, you need to turn on Remote JMX (Java Management Extensions) for the Atom.

Use a text editor to open the <atom_installation_directory>\bin\atom.vmoptions file.

Add the following lines to the file:

-Dcom.sun.management.jmxremote.port=5002
-Dcom.sun.management.jmxremote.rmi.port=5002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Единственная строка, которую я не видел ни в одной обложке ответов Stack Overflow, это

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

В моем случае я пытался получить метрики Kakfa, поэтому я просто изменил вышеуказанную опцию, чтобы она соответствовала значению -Dcom.sun.management.jmxremote.port. Таким образом, без какой-либо аутентификации, минимальная конфигурация должна выглядеть следующим образом:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=(jmx remote port)

-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=(jmx remote port)
-Djava.rmi.server.hostname=(CNAME|IP Address)
11 голосов
/ 30 сентября 2008

Вы работаете в Linux? Возможно, агент управления привязан к localhost:

http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1

7 голосов
/ 08 апреля 2016

Sushicutta шаги 4-7 можно пропустить, добавив следующую строку к шагу 3:

-Dcom.sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>

например. Добавить параметры запуска:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.rmi.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

Для переадресации портов подключитесь с помощью:

ssh -L 12345:localhost:12345 <username>@<host>

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

ssh -L 12345:localhost:12345 <username>@<host2>

Помните, что hostname = localhost необходим, чтобы убедиться, что jmxremote сообщает соединению rmi об использовании туннеля. В противном случае он может попытаться подключиться напрямую и подключиться к брандмауэру.

6 голосов
/ 11 октября 2013

PROTIP:

Порт RMI открыт в произвольном portnr. Если у вас есть брандмауэр и вы не хотите открывать порты 1024-65535 (или использовать vpn), вам нужно сделать следующее.

Вам необходимо исправить (как при наличии известного номера) порты RMI Registry и JMX / RMI Server. Вы делаете это, помещая jar-файл (catalina-jmx-remote.jar, в котором он находится в дополнительном) в lib-dir и настраивая специальный прослушиватель под сервером:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
      rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

(И, конечно же, обычные флаги для активации JMX

    -Dcom.sun.management.jmxremote  \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Djava.rmi.server.hostname=<HOSTNAME> \

См .: JMX Remote Lifecycle Listener на http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

Тогда вы можете подключиться, используя этот ужасающий URL:

service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi
5 голосов
/ 04 июня 2015

Проверьте, находится ли ваш сервер за брандмауэром. JMX базируется на RMI, которые открывают два порта при запуске. Одним из них является порт регистрации, по умолчанию 1099, и его можно указать с помощью опции com.sun.management.jmxremote.port. Другое предназначено для передачи данных и является случайным, что является причиной проблемы. Хорошая новость заключается в том, что в JDK6 этот случайный порт можно указать с помощью параметра com.sun.management.jmxremote.rmi.port.

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
4 голосов
/ 17 июня 2013

Получить JMX через брандмауэр очень сложно. Проблема в том, что стандартный RMI использует второй случайный назначенный порт (помимо реестра RMI).

У нас есть три решения, которые работают, но каждый случай требует своего:

  1. JMX через SSH-туннель с прокси-сервером Socks, использует стандартный RMI с магией SSH http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html

  2. JMX MP (альтернатива стандартному RMI), использует только один фиксированный порт, но нуждается в специальном банке на сервере и клиенте http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/

  3. Запустите код формы JMX Server, там можно использовать стандартный RMI и использовать фиксированный второй порт: https://issues.apache.org/bugzilla/show_bug.cgi?id=39055

...