VisualVM через брандмауэры - устранение неполадок RMI - PullRequest
6 голосов
/ 18 февраля 2011

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

Корпус: Мне нужно подключить VisualVM на моем компьютере к удаленным серверам (tomcats, weblogics) для мониторинга производительности / потоков / памяти. Эти серверы установлены на (физических или виртуальных) машинах, которые защищены брандмауэром. Большие интервалы портов открыты в брандмауэре и могут использоваться, но не для всех портов.

Тесты

  • Я пробовал прямые соединения через JMX в VisualVM, используя следующие опции JVM на стороне сервера при запуске сервера: -Djava.rmi.server.hostname=[hostname] -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=[port] -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

Я уточнил имя хоста, поскольку в моей сети имя хоста и IP-адрес сервера не совпадают с теми, которые указаны в сети удаленного сервера.

Не удалось, VisualVM всегда ищет неизвестный сервер.

  • попытался запустить jstatd на стороне сервера для порта, доступного (опция -p) из моего ящика (telnet на этом порту работает), но при запуске visualVM на этом хосте с портом jstatd он все еще выглядит ожидающим для чего-то недостижимого .... Такое же поведение при подключении jps к этому удаленному хосту.

  • попытался использовать те же инструменты на сервере с меньшей защитой сети, и это работает. Итак, я видел соединения между моей коробкой и сервером, и они выполняются на портах, отличных от того, что я указал для jstatd. Я понимаю, что этот порт необходим для первого соединения (типа рукопожатия), и реальный обмен данными осуществляется через другие порты, но не предсказуем (например, 60305, 55197, ...). Не уверен, что я очень хорошо понимаю, как работает RMI.

Пожалуйста, помогите мне, я схожу с ума!

Ответы [ 3 ]

7 голосов
/ 18 февраля 2011

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

  • положить файл с именем jmxremote.access в CATALINA_HOME/conf, который содержит следующие строки:

    monitorRole readonly
    controlRole readwrite
    
  • в server.xml установить порты, которые будут использоваться jmx, через специальный приемник tomcat (catalina-jmx-remote.jar требуется в / lib):

    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
        rmiRegistryPortPlatform="9009" rmiServerPortPlatform="9010" />
    

Тогдаоткройте эти два порта на брандмауэре.Оно работает.Но это только для tomcat.

Другой вариант - использовать ssh tunneling .Вкратце - вы подключаетесь через SSH и настраиваете его для переадресации некоторого локального порта (где работает клиент jmx) на некоторые порты на другой стороне туннеля.

Ссылки:

1 голос
/ 03 ноября 2016

Вот шаги для этого:

  1. Запустите ejstatd на удаленном хосте следующим образом (в папке ejstatd): mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101" (используется для подключения типа "jstatd")
  2. Запустите приложение Java с этими дополнительными параметрами Java: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1102 -Dcom.sun.management.jmxremote.rmi.port=1102 -Djava.rmi.server.hostname=[remote_host_name] (используется для соединения типа "JMX") (java.rmi.server.hostname требуется здесь только потому, что IP-адрес и имя хоста из вашей сети не совпадают с точкой сервера вид)
  3. Откройте эти 4 порта на удаленном хосте и сделайте их доступными для локального компьютера: 1099, 1100, 1101 и 1102
  4. Запустить JVisualVM
    1. Щелкните правой кнопкой мыши «Remote»> «Add Remote Host ...» и введите имя удаленного хоста в «Host name» (если вы не используете порт 1099, вы можете изменить его в « Расширенные настройки ")
    2. Щелкните правой кнопкой мыши на только что созданном удаленном хосте> «Добавить JMX-соединение ...» и введите «[remote_host_name]:1102» в поле «Соединение» и установите флажок «Не требовать SSL-подключения»
    3. Ваш Java-процесс появится дважды: один из типа соединения "jstatd" и один из типа соединения "JMX".

Отказ от ответственности: я являюсь автором инструмента с открытым исходным кодом ejstatd .

0 голосов
/ 16 ноября 2011

На вашем [hostname] откройте [port] и диапазон портов tcp 40000-60000 только для вашего IP.Это хорошо сработало для меня.

...