Невозможно подключиться к 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