У кого-нибудь когда-нибудь работала удаленная 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 ]

2 голосов
/ 27 января 2015

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

Подход sushicutta хорош, но он очень ручной, так как вам нужно каждый раз получать порт RMI. К счастью, мы можем обойти это, используя прокси-сервер SOCKS вместо явного открытия туннелей портов. Недостатком этого подхода является то, что приложение JMX, которое вы запускаете на своей машине, должно быть в состоянии настроить для использования прокси. Большинство процессов вы можете сделать это путем добавления свойств Java, но некоторые приложения не поддерживают это.

Шаги:

  1. Добавьте параметры JMX в сценарий запуска для удаленной службы Java:

    -Dcom.sun.management.jmxremote=true
    -Dcom.sun.management.jmxremote.port=8090
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    
  2. Установите прокси-соединение SOCKS с удаленным компьютером:

    ssh -D 9696 user@remotemachine.com
    
  3. Настройте локальное приложение для мониторинга Java на использование прокси-сервера SOCKS (localhost: 9696). Примечание: Вы можете иногда сделать это из командной строки, т.е.

    jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9696
    
2 голосов
/ 12 декабря 2008

При тестировании / отладке / диагностике удаленных проблем JMX, сначала всегда пытайтесь подключиться к тому же хосту, на котором находится MBeanServer (то есть localhost), чтобы исключить сетевые и другие специфичные для JMX проблемы.

1 голос
/ 10 октября 2018

У меня сработало следующее (хотя я думаю, что порт 2101 на самом деле не способствовал этому):

-Dcom.sun.management.jmxremote.port=2100
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=2101
-Djava.rmi.server.hostname=<IP_ADDRESS>OR<HOSTNAME>

Я подключаюсь с удаленного компьютера к серверу, на котором запущен Docker, и процесс находится внутри контейнера. Кроме того, я остановил firewallD, но не думаю, что это была проблема, так как я мог подключиться к 2100 даже при открытом брандмауэре. Надеюсь, это поможет.

1 голос
/ 15 июля 2010

Я использую JConsole / JVisualVm в Windows, подключенной к Tomcat под управлением Linux Redhat ES3.

Отключение фильтрации пакетов с помощью следующей команды помогло мне:

/usr/sbin/iptables -I INPUT -s jconsole-host -p tcp --destination-port jmxremote-port -j ACCEPT

где jconsole-host - это имя хоста или адрес хоста, на котором работает JConsole, а jmxremote-port - номер порта, заданный для com.sun.management.jmxremote.port для удаленного управления.

1 голос
/ 29 мая 2015

Я использую boot2docker для запуска док-контейнеров с Tomcat внутри, и у меня та же проблема, решение было:

  • Добавить -Djava.rmi.server.hostname=192.168.59.103
  • Используйте один и тот же порт JMX в контейнере хоста и докера, например: docker run ... -p 9999:9999 .... Использование разных портов не работает.
0 голосов
/ 22 декабря 2016

Я пытаюсь JMC запустить Flight Recorder (JFR) для профилирования NiFi на удаленном сервере, который не предлагает графическую среду для запуска JMC.

Основываясь на других ответах, приведенных здесь, и после множества проб и ошибок, вот что я предоставляю JVM ( conf / bootstrap.conf ) при запуске NiFi:

java.arg.90=-Dcom.sun.management.jmxremote=true
java.arg.91=-Dcom.sun.management.jmxremote.port=9098
java.arg.92=-Dcom.sun.management.jmxremote.rmi.port=9098
java.arg.93=-Dcom.sun.management.jmxremote.authenticate=false
java.arg.94=-Dcom.sun.management.jmxremote.ssl=false
java.arg.95=-Dcom.sun.management.jmxremote.local.only=false
java.arg.96=-Djava.rmi.server.hostname=10.10.10.92  (the IP address of my server running NiFi)

Я поместил это в / etc / hosts , хотя я сомневаюсь, что это необходимо:

10.10.10.92   localhost

Затем, после запуска JMC, я создаю удаленное соединение со следующими свойствами:

Host: 10.10.10.92
Port: 9098
User: (nothing)
Password: (ibid)

Кстати, если я щелкну URL-адрес пользовательской службы JMX, я увижу:

service:jmx:rmi:///jndi/rmi://10.10.10.92:9098/jmxrmi

Это, наконец, сделало это для меня.

0 голосов
/ 23 сентября 2015

Чтобы внести свой вклад, это то, что я сделал на CentOS 6.4 для Tomcat 6.

  1. Отключение службы iptables

    service iptables stop
    
  2. Добавьте следующую строку в tomcat6.conf

    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8085 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=[host_ip]"
    

Таким образом, я смог подключиться с другого компьютера с помощью JConsole.

0 голосов
/ 10 февраля 2015

Вот шаги, которые сработали для меня (Debian за брандмауэром на стороне сервера, через VPN с моего локального Mac):

проверка сервера ip

hostname -i

использовать параметры JVM:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=[jmx port]
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=[server ip from step 1]

Запустить приложение

найти pid запущенного процесса Java

проверить все порты, используемые JMX / RMI

netstat -lp | grep [pid from step 4]

открыть все порты с шага 5 на брандмауэре

Вуаля.

0 голосов
/ 27 августа 2013

Получение JMX через брандмауэр совсем не сложно. Есть один маленький улов. Вы должны перенаправить оба порта, настроенных JMX, т.е. 9010 и один из динамических портов, которые он слушает на моей машине, был> 30000

0 голосов
/ 28 марта 2013

Необходимо также убедиться, что имя вашего компьютера соответствует IP-адресу, к которому привязан JMX; НЕ localhost, ни 127.0.0.1. Для меня это помогло поместить запись в хосты, которая явно определяет это.

...