JMX: невозможно подключиться из окна Windows для мониторинга порта JMX в системе Linux - PullRequest
4 голосов
/ 21 марта 2011

У меня большой опыт работы с jconsole.exe и JVisualVM.exe, в JDK1.6, и я тысячи раз подключался из Windows JVM к Windows JVM на другом компьютере через JMX.remote, но это не удается, когда япопробуйте отслеживать экземпляр Java, работающий на хосте Linux (с хоста Windows, и я попробовал JMX-слушатель на redhat и SUSE на Amazon EC2).Я также попытался использовать jconsole.exe и получил похожую ошибку.

Есть ли причина, по которой кто-то может подумать, почему у такого типа соединения JMX возникнет проблема.Любые идеи, которые я могу попробовать?Кто-нибудь "на самом деле" сделал это и может сказать, что он будет работать, если я буду продолжать?

Ошибка, которую я получаю от JVisualVM (при попытке удаленного подключения), выглядит примерно так:

"Cannot connect using service:jmx:rmi:///jndi/rmi://<jmx service ip>:8001/jmxrmi"

Моя конфигурация удаленной службы JMX выглядит следующим образом:

 -Dcom.sun.management.jmxremote
 -Dcom.sun.management.jmxremote.port=8001
 -Dcom.sun.management.jmxremote.authenticate=false
 -Dcom.sun.management.jmxremote.hostname=<jmx service ip>

На аналогичном вопросе найдена эта ссылка , но он не ответил на мой вопрос.

Я это подтвердил "iptables "не включен в качестве службы и не включен, и поэтому я не представляю, нет ли какой-либо блокировки брандмауэра.Кроме того, и Windows, и машина Linux находятся в частной внутренней подсети 10.0.0.0 вместе.Я могу подключиться к порту 8001, чтобы проверить его там и прослушивание (netstat -ap) на компьютере с Linux.

Ответы [ 4 ]

6 голосов
/ 01 апреля 2011

См. Системное свойство java.rmi.server.hostname .На вашей Linux-сервере JVM задайте для этого системного свойства общедоступный IP-адрес хоста.Затем используйте общедоступный IP-адрес в вашем клиентском URL JMX.

2 голосов
/ 22 марта 2011

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

На вашем месте я бы попытался настроить jmxmp в качестве альтернативного протокола. Для этого вам нужно добавить jmxremote_optional.jar (бесплатно от Oracle, скачайте «Справочная реализация JMX Remote API 1.0.1_04 отсюда» ) и к серверу, и к пути к классам jvisualvm, но это того стоит.

Если вы заглянете в Google для jmxmp, вы найдете немало примеров того, как это настроить, одним из моих первых хитов будет http://pub.admc.com/howtos/jmx/distributed-chapt.html#jmxmp-sect, который может быть слишком ориентирован на код, но я все равно добавлю его сюда, потому что он объясняет такие вещи, как большинство, с помощью jmxmp в нескольких хороших предложениях.

Способ определения конечной точки на стороне сервера зависит от того, что вы используете. Большинство серверов приложений позволяют вводить URL-адрес службы jmx с поддержкой jmxmp, но если сервер написан с нуля, вам, возможно, придется настроить его самостоятельно в коде, а не использовать ключи -D для java, к которым вы привыкли.

Попробуйте и вернитесь с более конкретными вопросами, если у вас возникнут проблемы.

Edit: После того, как вы добавили jar в classpath, единственное, что вы должны сделать в своем коде (при условии, что вы не используете серверное приложение, которое уже обрабатывает его для вас), это следующее (исключая объявления, обработку исключений и тому подобное, как вы все равно разберись):

url=new JMXServiceURL(jmxurl);
this.server = JMXConnectorServerFactory.newJMXConnectorServer(url, null, ManagementFactory.getPlatformMBeanServer());
this.server.start();
1 голос
/ 22 марта 2011

Вы пытались создать SSH-туннель к Linux-машине с вашего компьютера с Windows? http://oldsite.precedence.co.uk/nc/putty.html

Или, если у вас есть cygwin, просто попробуйте ssh -f your-user@remote-server.com -L 7777:remote-server.com:123 -N, где 7777 - это порт на вашем компьютере с Windows, а 123 - это порт на удаленном компьютере Linux, который слушает команды JMX.

Используя любой из вышеперечисленных, вы можете использовать jconsole или visualvm на вашем компьютере с Windows и подключиться к localhost:7777.

Я знаю, что iptables отключен, но просто подтвердите, что JMX работает нормально на этом порту, выполнив SSHing в Linux и пытаясь использовать режим командной строки JMX для jconsole для localhost (в Linux).

0 голосов
/ 31 декабря 2014

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

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

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

  1. SSH к коробке, где запущено ваше приложение, но используйте опцию -D, например:

    ssh user @ remoteHost -D 9999

    Поскольку вы находитесь в Windows, вы можете использовать Cygwin для запуска вышеуказанной команды, или вы можете сделать то же самое с Putty через графический интерфейс (руководство здесь: http://blog.ashurex.com/2012/03/15/creating-ssh-proxy-tunnel-putty/)

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

  2. Откройте JVisualVM и в настройках в разделе «сеть» настройте его для использования прокси-сервера socks на локальном хосте, на порту 9999.

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

Удачи: -)

...