VisualVM через брандмауэры — устранение неполадок RMI

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

Случай: мне нужно подключить 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.

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


person JLM    schedule 18.02.2011    source источник
comment
Если вы используете Java 7, обновление 4, есть надежда с флагом `` -Dcom.sun.management.jmxremote.rmi.port=7091`` См. этот пост в блоге: hirt.se/blog/?p=289   -  person davey    schedule 10.10.2013


Ответы (3)


К сожалению, 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" />
    

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

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

Использованная литература:

person Bozho    schedule 18.02.2011
comment
Вы должны добавить, что также необходимо скопировать catalina-jmx-remote.jar в CATALINA_HOME/libs, иначе будет выброшено ClassNotFoundException. Для получения дополнительной информации по этой теме см. tomcat.apache.org/tomcat-6.0-doc/config/ - person ubuntudroid; 21.02.2013

Вот шаги, чтобы сделать это:

  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. Launch JVisualVM
    1. Right-click on "Remote" > "Add Remote Host..." and enter your remote host name in "Host name" (if you don't use the port 1099, you can change this in the "Advanced Settings")
    2. Щелкните правой кнопкой мыши только что созданный удаленный хост > «Добавить JMX-соединение...» и введите «[remote_host_name]:1102» в поле «Соединение» и установите флажок «Не требовать подключения SSL».
    3. Ваш Java-процесс появится дважды: один для типа соединения "jstatd" и один для типа соединения "JMX".

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

person Anthony O.    schedule 03.11.2016

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

person Maxym    schedule 16.11.2011
comment
Почему за этот ответ так сильно проголосовали? Это единственное, что мне реально помогло. - person Greg Dubicki; 07.02.2015
comment
Потому что простое открытие почти всех портов вашей машины для остального мира может работать на машине разработки, но наверняка невозможно в производственной/корпоративной среде. - person Sebastian J.; 14.01.2016