2011-02-18 17 views
6

Lo siento por esta pregunta que se debe haber preguntado muchas veces, pero no puedo resolver mi problema. He leído muchos blogs, sitios, foros, ... y no encontré ninguna solución en mi caso.VisualVM a través de firewalls: solución de problemas de RMI

caso: Necesito conectar VisualVM en mi caja de servidores distantes (Tomcats, weblogics) para la supervisión del rendimiento/hilos/memoria. Esos servidores están instalados en máquinas (físicas o virtuales) que están protegidas por un firewall. Se abren grandes intervalos de puertos en el firewall y se pueden usar, pero no en todos los puertos.

Pruebas de

  • He intentado conexiones directas a través de JMX en VisualVM, utilizando siguientes opciones de JVM en el lado del servidor al iniciar el servidor:
     
    -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 
    

He precisó la nombre de host porque desde mi red el nombre de host y la dirección IP del servidor no son los mismos que los de la red del servidor remoto.

Sin éxito, VisualVM siempre parece buscar un servidor desconocido.

  • juzgados a partir jstatd en el lado del servidor en un accesible (opción -p) Puerto de mi caja (telnet en este puerto las obras), pero cuando se lanza VisualVM en este host con el puerto jstatd, todavía parece esperando algo inalcanzable ... Mismo comportamiento con jps conectando a este host remoto.

  • intentado utilizar las mismas herramientas en un servidor con menos protección de red, y funciona. Así que he visto las conexiones entre mi caja y el servidor y están hechas en puertos diferentes de lo que he especificado para jstatd. Entiendo que este puerto es necesario para la primera comunicación (tipo de handshake) y las comunicaciones reales se realizan en otros puertos, pero no son predecibles (por ejemplo, 60305, 55197, ...). No estoy seguro de entender muy bien cómo funciona RMI.

Por favor, ayúdame, me estoy volviendo loco!

+0

Si tiene la actualización 4 de Java 7, hay esperanza con la marca '' -Dcom.sun.management.jmxremote.rmi.port = 7091'' Vea esta publicación en el blog: http://hirt.se/ blog /? p = 289 – davey

Respuesta

7

Desafortunadamente, JMX intenta abrir puertos que no sean los que configura. Ayer mismo tuve éxito al conectarme a Tomcat detrás del cortafuegos a través de JMX. Las dos partes difíciles son:

  • poner un archivo llamado jmxremote.access en CATALINA_HOME/conf, que contiene las siguientes líneas:

    monitorRole readonly 
    controlRole readwrite 
    
  • en server.xml conjunto de los puertos que serán utilizados por jmx, a través de un especial oyente tomcat (catalina-jmx-remote.jar requerida en/lib):

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

A continuación, abra estos dos puertos en el firewall. Funciona. Pero eso es solo para Tomcat.

Otra opción es usar ssh tunnelling. En resumen: se conecta a través de SSH y lo configura para reenviar un puerto local (donde se ejecuta el cliente jmx) a algunos puertos en el otro lado del túnel.

Referencias:

+2

Debería agregar que ese también tiene que copiar el 'catalina-jmx-remote.jar' en' CATALINA_HOME/libs'; de lo contrario, se lanza 'ClassNotFoundException'. Para leer más sobre este tema, ver http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html#JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener – ubuntudroid

0

En su [nombre de host], se abren rango [puerto] y el puerto TCP 40000 hasta 60000 por sólo su IP. Esto me ha funcionado bastante bien.

+0

¿Por qué esta respuesta ha sido downvoted tanto? Este es el único que realmente me ayudó. –

+2

Porque simplemente abrir casi todos los puertos de su máquina al resto del mundo podría funcionar en una máquina de desarrollo, pero con seguridad no es factible en un entorno de producción/empresa. –

1

Éstos son los pasos para hacer esto:

  1. lanzamiento de un ejstatd en su host remoto esta manera (en la carpeta ejstatd): mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101" (utilizado para la conexión de tipo "jstatd")
  2. lanzar la aplicación Java con esos parámetros adicionales de 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] (usado para la conexión de tipo "JMX") (java.rmi.server.hostname es requerido aquí solo porque la IP y el nombre de host de su red no son los mismos que el punto de vista del servidor)
  3. Abra esos 4 puertos en su host remoto y ponerlos a disposición de su equipo local: 1099, 1100, 1101 y 1102
  4. lanzamiento jvisualvm
    1. Haga clic en "Remote"> "Agregar host remoto ..." e introduzca su nombre de host remoto en "nombre de host" (si no use el puerto 1099, puede cambiar esto en "Configuración avanzada")
    2. Haga clic derecho en el host remoto que acaba de crear> "Agregar conexión JMX ..." y escriba "[remote_host_name]:1102" en " Conexión "ingrese y compruebe" No requiere conexión SSL "
    3. Su proceso Java aparecerá dos veces: uno de" jstatd " "tipo de conexión, y uno del tipo de conexión" JMX ".

responsabilidad: yo soy el autor de la herramienta de código abierto ejstatd.

Cuestiones relacionadas