Подтвердить что ты не робот

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

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

Я включил следующий параметр в remote tomcat 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"
4b9b3361

Ответ 1

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

Кажется, сервер RMI не прослушивал правильный ip. Итак, как было предложено в этом связанном вопросе, я добавил следующее:

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

до JAVA_OPTS, а затем он работал.

Ответ 2

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

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

Решение для tomcat на linux:

использовать tomcat 6.0.24 или новее Загрузите Catalina-jmx-remote.jar из apache tomcat extras (используйте страницу загрузки tomcat) скопируйте его в $CTALINA_HOME\lib

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

отредактируйте раздел сервера в вашем 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

end jmxremote.password будет

monitorRole tomcat
controlRole tomcat

(просто простые пространства)

перезапустить 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 в нашем примере.

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

Ответ 3

Пробовал с Java 8

1. Добавьте это в свой java tomcat startup script:

-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 [email protected] -L 1616:remote-host:1616

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

    ssh [email protected] -L 1616:remote-host:1616

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

jconsole localhost:1616

4. Получайте удовольствие!

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

Ответ 4

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

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi

Ответ 5

Включить 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 like -

[...]

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, содержащий:

admin letmein

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

admin readwrite

$ chmod 600 jmxremote.password

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

$echo|telnet 10.105.14.90 10001

Ответ 6

Что именно вы имеете в виду, когда говорите "Но не удается связаться успешно"? Есть ли сообщение об ошибке? Попробуйте включить logging в 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

Ответ 7

если вы работаете с 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)

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

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

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

-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

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

Ответ 8

У меня есть кое-что для всех вас, чтобы завершить исследование всего этого. Есть трюк, бывает, что инструмент профилировщика связан с 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/

Надеемся на помощь парням!

И удачи!

Ответ 9

Проверьте, находится ли ваш сервер за брандмауэром. 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"

Ответ 10

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

Ответ 11

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

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

P.D: Мой английский очень плохой, я знаю. Мои извинения.

Ответ 12

PROTIP: вам необходимо исправить (как при наличии известного номера) RMI-реестр и порты JMX/RMI Server. Вы делаете это, помещая 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