Подключение удаленного экземпляра 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"
- Передача аргументов JVM Tomcat при работе в качестве службы?
- Позорное java.sql.SQLException: не найдено подходящего драйвера
- java.lang.IllegalArgumentException: Неверный в отображении сервлета
- Как изменить порт Tomcat с 8080 до 80?
- Tomcat VS Jetty
- java.lang.IllegalArgumentException: указанный основной набор ресурсов недействителен
- Увеличить пространство пермгенов
- Что делает атрибут crossContext в Tomcat? Включает ли это совместное использование сеанса?
- Как указать корневой контекст в тегах в web.xml?
- «Сервер Tomcat v7.0 Сервер на локальном хосте не смог запустить» без трассировки стека, когда он работает в терминале
- JBoss vs Tomcat снова
- IntelliJ не может запускать простое веб-приложение: невозможно подключиться к серверу ping на localhost: 1099
- Как добавить родную библиотеку в Tomcat?
У меня была аналогичная, если не та же проблема. Я мог бы подключиться к серверу JMX, если бы я запускал jconsole локально на машине.
Кажется, сервер RMI не прослушивал правильный ip. Итак, как было предложено в этом связанном вопросе , я добавил следующее:
-Djava.rmi.server.hostname=
к JAVA_OPTS
, а затем это сработало.
Я собрал информацию, распространяющуюся по сети, найденную с подсказками от других участников.
Большая боль, вызванная JMX, – это (imo) тот факт, что JMX открывает второй динамически выделенный сетевой порт. Брандмауэр (например, iptables) блокирует это.
Решение для tomcat на linux:
используйте tomcat 6.0.24 или более новую версию downloadina-jmx-remote.jar от apache tomcat extras (используйте страницу загрузки tomcat) скопируйте ее в $ CTALINA_HOME \ lib
Это позволяет вам устанавливать оба порта, используемые JMX
отредактируйте раздел сервера в файле server.xml
...
установить некоторые переменные среды (например, в 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 в нашем примере.
Если между рабочей станцией и сервером больше нет брандмауэров, он должен работать.
Пробовал с 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 [email protected] -L 1616:remote-host:1616
-
Пользователи Linux и Mac :
ssh [email protected] -L 1616:remote-host:1616
3. Запустите jconsole
на компьютере
jconsole localhost:1616
4. Получайте удовольствие!
- PS: во время шага 2 с помощью
ssh
и-L
вы указываете, что порт 1616 на локальном (клиентском) хосте должен быть перенаправлен на удаленную сторону. - PS2 .: вы можете указать один и тот же порт для JMX и RMI-цепочек
какую строку вы используете в качестве URL-адреса соединения JMX. Я не хочу указывать на очевидное, но у JConsole есть ужасный интерфейс, и для меня требуется слишком сложный URL-адрес, прежде чем он подключится к удаленному jmx-приложению. Моя выглядит так:
service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi
Включить JMX в Tomcat8, успешно протестирован в моем POC
1 / Загрузите catalina-jmx-remote.jar
с сайта apache и поместите его в $CATALINA_HOME/lib
.
2 / Возьмите setenv.sh
копию server.xml
/ setenv.sh
. Внесите изменения в server.xml
3 / Внесите изменения в $CATALINA_BASE/bin/setenv.sh
like –
[...] JVM_OPTS="[...] -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=true -Djava.rmi.server.hostname=| <`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 tool 🙂
$echo|telnet 10.105.14.90 10001
Что именно вы имеете в виду, когда говорите «Но не удается связаться успешно»? Есть ли сообщение об ошибке? Попробуйте включить ведение журнала в 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
если вы работаете над linux, измените файл catalina.sh, добавив:
CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname= -Dcom.sun.management.jmxremote.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. Будьте осторожны, чтобы не добавлять конечные пробелы и использовать символ «[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
Надеюсь, поможет
Проверьте, находится ли ваш сервер за брандмауэром. 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"
У меня есть кое-что для всех вас, чтобы завершить исследование всего этого. Есть трюк, бывает, что инструмент профилировщика связан с 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 / отладки-с-JConsole-JMX-SSH-туннелей /
Надеюсь внести свой вклад!
И удачи!
Ну, у меня была эта проблема в Linux-ящике (виртуальная машина), и я исправил ее с использованием свойства -Djava.rmi.server.hostname, но я ничего не могу понять. Моя машина имеет 5 серверов tomcat, все из которых имеют jmx в последовательных портах (8008, 8018, 198028 …), и только одна из них связана с этой проблемой при подключении JMX. Нет брандмауэра, нет -Djava.rmi.server.hostname свойства в любом tomcat ….
Поэтому я понимаю проблему, но я не могу понять, почему 4 моих кота работали, а 1 из них – нет.
PD: Мой английский очень плохой, я знаю. Мои извинения.
PROTIP: вам необходимо исправить (как при наличии известного номера) 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= \
См. JMX Remote Lifecycle Listener по адресу http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html.
Изменение /etc/hosts
в Linux, где я заменил адрес локального хоста, связанный с моей учетной записью, на машину ip, решил эту проблему для меня.