Проводя уже около 6 лет собеседования с Java-разработчиками заметил, что из приходивших кандидатов вообще никто не знает, что можно штатными средствами JDK удалённо мониторить состояние JVM с контейнерами сервлетов.
Поэтому далее пошаговый рецепт, как настроить и использовать эту замечательную возможность
Инструменты мониторинга
- JConsole — GUI-инструмент для мониторинга и управления как локальными, так и удаленными JVM и приложениями. Про него читаём официальные доки
- JVisualVM — упрощённо — это JConsole + профилировщик. Про этот инструмент отлично написал TheShade
Оба программных продукта расположена в %JAVA_HOME%/bin JDK и используют технологию JMX — Java Management Extensions
Настройка Tomcat
%CATALINA_HOME% — каталог, в который установлен Tomcat.
- В каталоге %CATALINA_HOME%/conf создать конфиг-файл remote.users с содержимым вида
ЛОГИН_ПОЛЬЗОВАТЕЛЯ1 ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ1 ЛОГИН_ПОЛЬЗОВАТЕЛЯ2 ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ2
Имя файлу можно дать любое на ваше усмотрение. Файл содержит логины и пароли в явном (к сожалению) виде пользователей, которые будут иметь право осуществлять удалённый мониторинг.
Например:tartaren from_tarascon portos passwordportos
- В каталоге %CATALINA_HOME%/conf создать конфиг-файл remote.acl с содержимым вида
ЛОГИН_ПОЛЬЗОВАТЕЛЯ1 ПРАВА_ДОСТУПА ЛОГИН_ПОЛЬЗОВАТЕЛЯ2 ПРАВА_ДОСТУПА
Имя файлу можно дать любое на ваше усмотрение. ПРАВА_ДОСТУПА — одна из двух констант readwrite или readonly.
Например:tartaren readonly portos readwrite
- chmod 400 remote.users
- chmod 400 remote.acl
- chown tomcat:tomcat remote.users
(пользователя и группу tomcat возможно необходимо заменить по ситуации) - chown tomcat:tomcat remote.acl
(пользователя и группу tomcat возможно необходимо заменить по ситуации) - Найти скрипт запуска catalina.sh (обычно находится в %CATALINA_HOME%/bin)
- В скрипте перед секцией запуска добавить команду:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.password.file=ПОЛНЫЙ_ПУТЬ_К_remote.users -Dcom.sun.management.jmxremote.access.file=ПОЛНЫЙ_ПУТЬ_К_remote.acl -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=НОМЕР_ПОРТА -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<b>IP_АДРЕС"
IP_АДРЕС — IP-адрес Tomcat-сервера.
НОМЕР_ПОРТА — Номер порта, на котором Tomcat-сервер будет отвечать на запросы JConsole или JVisualVM.
Например:* * * fi CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS" shift fi CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.password.file=/usr/share/apache-tomcat-7.0.22/conf/remote.users -Dcom.sun.management.jmxremote.access.file=/usr/share/apache-tomcat-7.0.22/conf/remote.acl -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7777 -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=1.1.1.1" if [ "$1" = "debug" ] ; then if $os400; then echo "Debug command not available on OS400" exit 1 * * *
- Если хочется отключить парольную аутентификацию, то в список параметров CATALINA_OPTS необходимо добавить -Dcom.sun.management.jmxremote.authenticate=false
- Чтобы изменения в конфиге и скрипте вступили в силу, необходимо штатными средствами перезапустить Tomcat
Настройка Jetty
- Создать файлы remote.users и remote.acl (или с любыми иными именами на ваше усмотрение) в устраивающих вас каталогах.
- chmod 400 remote.users
- chmod 400 remote.acl
- chown jetty:jetty remote.users
(пользователя и группу jetty возможно необходимо заменить по ситуации) - chown jetty:jetty remote.acl
(пользователя и группу tomcat возможно необходимо заменить по ситуации) - Чаще всего Jetty используется в связке с Maven. Для запуска создать скрипт reboot.sh
export MAVEN_OPTS="-Dcom.sun.management.jmxremote.password.file=/ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ/remote.users -Dcom.sun.management.jmxremote.access.file=/ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ/remote.acl -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=ПОРТ_ДЛЯ_МОНИТОРИНГА -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=IP_СЕРВЕРА" mvn -P dev clean compile jetty:run
- chmod +x reboot.sh
- Запускать (перезапускать) Jetty командой ./reboot.sh
Подключение JConsole
- запустить JConsole
- в появившейся форме:
- выбрать режим Remote Access
- ввести IP или доменное имя контейнера сервлетов c номером порта в формате
IP_ИЛИ_ДОМЕН: НОМЕР_ПОРТА - заполнить поля Username и Password
- нажать кнопку [Connect]
JConsole не сохраняет параметры подключения и их вводить надо каждый раз.
Если в контейнере сервлетов отключить парольную аутентификацию мониторинга, то подключаться можно командой jconsole IP_ИЛИ_ДОМЕН: НОМЕР_ПОРТА
Подключение JVisualVM
- запустить JVisualVM
- выбрать в меню File->Add JMX connection
- в появившейся форме:
- Connection — ввести IP или доменное имя контейнера сервлетов c номером порта в формате
IP_ИЛИ_ДОМЕН: НОМЕР_ПОРТА - если есть желание — включить «галку» Display name и ввести желаемый псевдоним для этого подключения
- включить «галку» Use security credentials
- заполнить поля Username и Password
- по желанию — включить «галку» Save security credentials
- нажать кнопку [OK]
- в левом дереве, в пункте Remote появится новый раздел с нашим контейнером
- на этом контейнере нажать правую кнопку мыши и выбрать пункт Open
Автор: gis