Невозможно подключиться к Tomcat с помощью VisualVM

У меня возникают проблемы с мониторингом удаленного процесса Tomcat. Я пытаюсь использовать версии Java 6 JConsole/JVisualVM.

У меня работает jstatd на удаленном сервере с соответствующей политикой безопасности. Процесс запущен и доступны TCP-соединения.

Когда я пытаюсь подключиться через JConsole, я получаю 'Connection Failed:jmxrmi'.

Когда я пытаюсь подключиться через VisualVM, я добавляю имя хоста, а мои параметры правой кнопки мыши - "Добавить соединение JMX". Мне непонятно, из документов, независимо от того, что бы я ожидал увидеть. Когда я пытаюсь подключиться, я получаю:

'Cannot connect using service:jmx:rmi:///jndi/rmi://<host>:<port>/jmxrmi'.

Итак, документы предлагают мне только, чтобы jstatd работал удаленно, чтобы контролировать в VisualVM, в то время как пользовательский интерфейс запрашивает jmxrmi. То же самое? Я попытался настроить tomcat с помощью параметров jmx rmi, а также тайм-аут, хотя я знаю, что это не проблема с брандмауэром.

Если кто-то успел получить удаленный процесс Tomcat, прилагаемый таким образом, и мог бы описать, как это могло бы помочь мне многое.

Ответы

Ответ 1

Обычно вам нужно указать IP-адрес сервера в JAVA_OPTS. В противном случае, похоже, что JMX собирается отправить инструкции клиенту для повторного подключения к серверу на другом порту, и если у него нет IP-адреса для предоставления клиенту, соединение не удастся.

Аргумент для этого:

-Djava.rmi.server.hostname=1.2.3.4

Подробнее об этом можно узнать в в процессе настройки.

Ответ 2

Вам нужно включить расширения управления для VM Tomcat. Обычно это означает прохождение в нечто подобное:

-Dcom.sun.management.jmxremote.port=8086
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

Конечно, если вы сделаете это выше, убедитесь, что ваш Tomcat не отображается в Интернете или порт брандмауэр удален из удаленного доступа или принимает аналогичные меры безопасности, чтобы избежать сканирования и компрометации порта. В противном случае используйте параметры проверки подлинности.

Ответ 3

Порт JMX обычно отправляет данные на другой порт, поэтому вам нужно найти этот номер порта, выполнив lsof -p -n | grep TCP и разрешить разрешения для этого порта, а затем попытаться подключиться к удаленному агенту JMX.

Ответ 4

Я фактически сам решил эту проблему и понял ее.

Я бы сказал, что проблема связана с RMI - вы не можете предсказать, какие порты он будет использовать, и поэтому вы не можете заставить его работать с брандмауэром.

Обходной путь заключается в использовании прокси-сервера SSH:

  • SSH в поле, где выполняется ваше приложение, но используйте параметр -D, например:

    ssh user @remoteHost -D 9999

    Это запустит прокси-сервер socks на вашей локальной машине на порту 9999.

  • Откройте JVisualVM и в настройках в разделе "network" настройте его на использование прокси-сервера socks на localhost, на порте 9999.

Если вы сделаете это, вы должны иметь возможность подключиться к удаленному компьютеру как обычно, и поскольку весь трафик RMI теперь проходит через прокси-сервер SSH, он пробивается через брандмауэр и прекрасно работает.

Удачи: -)

Ответ 5

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

http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx