Подключение удаленного экземпляра Tomcat JMX с помощью jConsole

Я пытаюсь подключиться к удаленному экземпляру Tomcat JMX с помощью jConsole. Но не могу успешно подключиться. Любая идея?

Я включил следующую опцию в удаленный кот catalina.sh:

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=9004 \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false"

person Niger    schedule 12.08.2009    source источник
comment
Вы используете упакованную версию Tomcat или устанавливали ее вручную? Еще кое-что, можете ли вы вставить полную ошибку?   -  person Pascal Thivent    schedule 21.10.2009
comment
Аналогичный вопрос: stackoverflow.com/questions/151238/   -  person Vadzim    schedule 02.11.2017


Ответы (12)


У меня была похожая, если не та же проблема. Я мог бы подключиться к серверу JMX, если бы я запускал jconsole локально на машине.

Похоже, что сервер RMI не прослушивал правильный IP-адрес. Итак, как было предложено в этот связанный вопрос, Я добавил следующее:

-Djava.rmi.server.hostname=<host ip>

на JAVA_OPTS, и тогда это сработало.

person waxwing    schedule 19.08.2009
comment
Сработал для меня, я просто установил IP-адрес хоста на 127.0.0.1, и он работал у меня на моем локальном компьютере. - person rado; 10.09.2010
comment
Добавляем ли мы это в JAVA_OPTS сервера или JAVA_OPTS на локальном компьютере? - person Joshua Partogi; 07.10.2010
comment
Замечательно, у меня была такая же проблема при использовании JMX для мониторинга удаленного ActiveMQ. Это исправило это. Большое спасибо. - person Khue Vu; 29.09.2011
comment
у меня не работает. У меня есть LAS-кот. Думаю настройки могут быть разные - person vsingh; 29.09.2011

Я собрал информацию, распространившуюся по сети, с подсказками других участников.

Наибольшую боль, вызванную JMX, вызывает (imo) тот факт, что JMX открывает второй динамически выделяемый сетевой порт. Брандмауэр (например, iptables) заблокирует это.

Решение для tomcat в Linux:

используйте tomcat 6.0.24 или новее, загрузите catalina-jmx-remote.jar из дополнительных компонентов apache tomcat (используйте просмотр на странице загрузки tomcat), скопируйте его в $ CTALINA_HOME \ lib

Это позволяет вам установить оба порта, используемые JMX.

отредактируйте раздел Server в вашем server.xml

<Server port="8005" ..>
  ...
  <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>

установить некоторые переменные среды (например, в setenv.sh)

CATALINA_OPTS="
  -Djava.rmi.server.hostname=IP-TO-LISTEN
  -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password 
  -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access 
  -Dcom.sun.management.jmxremote.ssl=false"

это активирует контроль доступа для JMX

jmxremote.access будет выглядеть как

monitorRole readonly
controlRole readwrite

конец jmxremote.password будет

monitorRole tomcat
controlRole tomcat

(просто пробелы)

перезапустите кота.

Теперь настройте брандмауэр на сервере (например, iptables).

/ и т.д. / sysconfig / iptables

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT

и / etc / sysconfig / ip6tables

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT

перезапустить iptables

Сделанный!

Теперь используйте VisualVM или JConsole на своей рабочей станции, чтобы установить соединение с rmiRegistryPortPlatform, 9840 в нашем примере.

Если между рабочей станцией и сервером больше нет брандмауэров, все должно работать.

person Hajo Thelen    schedule 21.07.2011
comment
+1 спасибо! отлично поработали! Мне просто нужно было добавить еще одну строчку: -Djava.rmi.server.hostname=<server-name>. - person Ortwin Angermeier; 06.09.2012
comment
Должен ли он также быть -Dcom.sun.management.jmxremote.port=9840 в tomcat.conf? - person Nic Cottrell; 09.06.2013
comment
Я вижу - слушатель заботится о порте. Но какую строку подключения вы используете в этом примере? - person Nic Cottrell; 23.06.2013
comment
@NicholasTolleyCottrell: строка подключения похожа на monitorRole @ IP-TO-LISTEN: 9840 или service: jmx.rmi: /// jndi / rmi / IP-TO-LISTEN: 9840 - person Hajo Thelen; 19.02.2014
comment
@NicholasTolleyCottrell: нам не нужно указывать порт параметром. Это делается с помощью конфигурации слушателя в server.xml. - person Hajo Thelen; 19.02.2014

Пробовал с Java 8

1. Добавьте это в свой сценарий запуска java tomcat:

-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

например, добавьте в bin / setenv.sh это:

export CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote.port=1616 \
-Dcom.sun.management.jmxremote.rmi.port=1616 \
-Dcom.sun.management.jmxremote.local.only=true \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false "

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 на локальном (клиентском) хосте должен быть перенаправлен на удаленную сторону.
  • P.S.2: вы можете указать один и тот же порт для разговоров JMX и RMI
person freedev    schedule 24.11.2015
comment
спасибо смог запустить rmiregistry и rmicomm в одном порту. Это работает без tomcat / conf / server.xml JMXRemoteLifecycleListener. Есть ли какие-то проблемы, о которых следует знать, если не использовать этот слушатель? - person Whome; 01.12.2015
comment
@Whome Извините, я пропустил ваш комментарий. Нет, по моему опыту противопоказаний нет. - person freedev; 24.05.2017

какую строку вы используете в качестве URL-адреса подключения JMX. Я не хочу указывать на очевидное, но у JConsole ужасный интерфейс, и для меня требуется слишком сложный URL-адрес, прежде чем он подключится к удаленному приложению jmx. Мой выглядит так:

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi
person Matt    schedule 19.05.2010

Включить JMX в Tomcat8, успешно протестировано в моем POC

1 / Загрузите catalina-jmx-remote.jar с веб-сайта apache и поместите в $CATALINA_HOME/lib.

2 / Сделайте server.xml / setenv.sh резервную копию. Внесите изменения в server.xml, как показано ниже:

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

3 / Внесите изменения в $CATALINA_BASE/bin/setenv.sh как -

[...]

JVM_OPTS="[...] 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=true 
-Djava.rmi.server.hostname=<eth:0_IP>| <`hostname -i`> 
-Dcom.sun.management.jmxremote.password.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.access 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote=true "

4 / Создайте эти два файла как - $touch $CATALINA_BASE/conf/jmxremote.password, содержащие:

админ letmein

$touch $CATALINA_BASE/conf/jmxremote.access содержащий:

админ читать, писать

$ chmod 600 jmxremote.password

5 / Перезапустите tomcat и проверьте инструмент jconsole :)

$echo|telnet 10.105.14.90 10001
person Bkkv    schedule 24.02.2016

Что именно вы имеете в виду, когда говорите «Но не удается подключиться успешно»? Есть сообщение об ошибке? Попробуйте включить ведение журнала в jconsole и посмотрите, поможет ли это отладить его.

Чтобы включить ведение журнала jconsole, отредактируйте файл с именем logging.properties в каталоге, в котором вы будете запускать jconsole, и добавьте:

handlers= java.util.logging.ConsoleHandler

.level=INFO

java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

javax.management.level=FINEST
javax.management.remote.level=FINEST

Затем запустите jconsole с:

jconsole -J-Djava.util.logging.config.file=logging.properties
person joe p    schedule 12.08.2009
comment
Джо, у меня следующее исключение. Игнорирование ошибки регистрации предполагает, в чем проблема на com.sun.jmx.remote.util.ClassLogger.finer (ClassLogger.java:130) на com.sun.jmx.remote.util.ClassLogger.trace (ClassLogger.java:88) на javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:245) на javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:227) на sun.tools.jconsole.ProxyClient.tryClient. java: 334) на sun.tools.jconsole.ProxyClient.connect (ProxyClient.java:296) на sun.tools.jconsole.VMPanel $ 2.run (VMPanel.java:280) - person Niger; 13.08.2009
comment
Извините, у меня есть опечатка в тексте logging.properties. Я отредактировал свой пост, попробуйте снова создать этот файл и посмотреть, сможете ли вы получить отладочную информацию. - person joe p; 14.08.2009
comment
Нет, мы не можем просматривать журналы. Где это создавало журналы? - person Java Guy; 05.05.2011

если вы работаете в Linux, измените файл catalina.sh, добавив:

                CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<HOST_IP> -Dcom.sun.management.jmxremote.port=<HOST_PORT> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
            export CATALINA_OPTS

или измените файл / etc / profile как root и перезапустите файл (источник / etc / profile)

если вы работаете в Windows и запускаете tomcat из командной строки, используйте переменную среды CATALINA_OPTS

если вы работаете с Windows и запускаете tomcat как службу, вам необходимо использовать служебную утилиту монитора для настройки параметров инициализации службы (ни setenv.bat, ни catalina.bat, ни env-vars не будут работать). для этого вам понадобится имя службы, которое отображается в services.msc (например, jasperreportsTomcat). После вам нужно будет открыть консоль от имени администратора и выполнить (например): tomcat6w.exe // MS // jasperreportsTomcat

с помощью этой команды появится значок в трее, где вы можете открыть панель. На вкладке «Java» теперь вы можете изменить параметры jmx. Будьте осторожны, не добавляйте завершающие пробелы и используйте символ «[ввод]» для разделения каждой опции строка за строкой.

-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=192.168.61.101
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

Надеюсь, поможет

person andhdo    schedule 11.10.2013

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

добавьте строку в свой {tomcat_dir} /bin/setenv.sh:

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"
person arganzheng    schedule 04.06.2015

У меня есть кое-что для всех вас, чтобы завершить расследование всего этого дела. Есть уловка: бывает, что инструмент профилировщика подключается к jvm через порт, но jvm продолжает диалог, используя другой случайный порт. Если jvm работает на удаленном компьютере (например, на сервере веб-приложений tomcat) и удаленный компьютер имеет защиту от исходящих и входящих подключений, вы должны установить системное свойство java com.sun.management.jmxremote.rmi.port на то же значение свойства с именем com.sun.management.jmxremote.port

Источник: https://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error А также проверьте это: http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

Надеюсь внести свой вклад, ребята!

И удачи!

person Victor    schedule 10.12.2014

Ну, у меня была эта проблема в Linux (виртуальной машине), и я исправил ее с помощью свойства -Djava.rmi.server.hostname, но есть вещь, которую я не могу понять. На моей машине 5 серверов tomcat, на всех из них включен jmx в последовательных портах (8008,8018,8028 ...), и только у одного из них была проблема с подключением JMX. Нет брандмауэра, нет свойства -Djava.rmi.server.hostname ни в одном коте ....

Дело в том, что я понимаю проблему, но не могу понять, почему 4 моих кота работали, а 1 - нет.

П.Д .: Я знаю, что у меня очень плохой английский. Мои извинения.

person Icarokun    schedule 17.11.2011

ЗАЩИТА: Вам необходимо исправить (как при наличии известного номера) реестр RMI и порты сервера JMX / RMI. Вы делаете это, помещая jar-файл в lib-dir и настраивая специальный слушатель. (И, конечно же, обычные флаги для активации JMX

    -Dcom.sun.management.jmxremote  \
    -Dcom.sun.management.jmxremote.port=8999 \
    -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

person supdog    schedule 11.10.2013

Изменение /etc/hosts в Linux, где я заменил адрес localhost, связанный с моей учетной записью, на IP-адрес машины, решило эту проблему для меня.

person PedroG    schedule 11.03.2011