2012-09-07 11 views
5

Lo siento si esto es una repetición de una pregunta hecha anteriormente, pero he probado las soluciones proporcionadas aquí y en todas partes y ninguna de ellas parece funcionar para mí.Monitoreo remoto de un servidor Tomcat 7 usando VisualVM y SSH

Escenario: Tengo que perfilar un servidor Tomcat 7 de producción que se encuentre detrás de un cortafuegos. Solo tengo acceso SSH a este servidor. La herramienta de creación de perfiles es Visualvm y estos servidores no tienen una GUI instalada. Tanto el servidor como la máquina que estoy tratando de conectar ejecutan el servidor Ubuntu 10.04 LTS.

Posible solución: Usando VisualVM sobre túneles SSH parece ser posible y el enlace a continuación da una guía muy detallada para hacer esto:

Tomcat+VisualVM+SSH guide

También he añadido un archivo jmxremote.access a la dir/conf en Tomcat con las dos líneas siguientes:

monitorRole readonly 
controlRole readwrite 

Problema: he seguido el paso s proporcionado en el artículo y todo parece estar bien. Puedo conectarme a los puertos jmx en el servidor localmente (desde el servidor) usando jmxterm y la cadena de conexión dada en la guía.

Configuré tomcat local según la guía como prueba y Visualvm no tuvo problemas para conectarse a esta instancia de tomcat utilizando la cadena de conexión.

Sin embargo, VisualVM no se conectará al servidor remoto a través del túnel SSH. Probé JConsole como lo más simple y tiene mejores facilidades de registro y me da la siguiente secuencia de mensajes:

FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] connecting... 
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] finding stub... 
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] connecting stub... 
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] getting connection... 
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi://localhost:12009/jndi/rmi://localhost:12008/jmxrmi] failed to connect: java.rmi.NoSuchObjectException: no such object in table 

alguna idea de lo que he hecho mal aquí? ¡Cualquier ayuda es muy apreciada!

Gracias.

Respuesta

2

Creo que el problema que está teniendo, que el artículo al que se hace referencia en realidad no aborda, es la forma en que jmx-rmi, o más específicamente, funciona la RMI. Su configuración del servidor Tomcat como esto:

  1. creado un utilizable de forma remota RMI que está configurado para conectarse a localhost: 12009.
  2. Creó un registro RMI en localhost con un puerto de escucha de localhost: 12008.

Cuando se ejecuta localmente, buscar el talón en el registro RMI, y cuando se invoca contra el talón para emitir una llamada jmx, se conecta a localhost: 12009, no hay problema.

Al ejecutar de forma remota a través de SSH, estoy asumiendo que haya un túnel desde el control remoto al servidor Tomcat en el puerto 12008, por lo que cuando se emite su solicitud, su de distancialocalhost:12008 forma un túnel a tomcatServer:12008 desde la salida del registro parece indique que encontró el talón bien.

A continuación, su control remoto se ejecuta contra el stub que a su vez intenta conectarse a localhost:12009 y falla.

Mi conjetura es que se necesita para hacer un túnel localhost de su control remoto: 12008 y localhost: 12009 a ser redirigido a tomcatServer: 12008 y tomcatServer: 12009.

Otra forma de evitar esto es para abandonar el protocolo RMI jmx y usar algo como Jolokia (HTTP), JMX-WS (servicio Web HTTP) o JMXMP (zócalo). Esto hará que tu vida de tunelización SSH sea mucho más fácil. Si quieres probar JMXMP, creé un proyecto github llamado OpenDMK que tiene construcciones mavenizadas. Querrá el paquete jmx-optional.

+0

Nicholas, gracias por la respuesta. Tengo localhost: 12008 y localhost: 12009 tunelizados a los puertos correspondientes en el servidor tomcat. Simplemente no está funcionando. Tomé su sugerencia para probar JMXMP y funciona magníficamente. Gracias. – ChamaraG

0

Gracias por su pregunta! - Tenía la misma necesidad básica. Lo siento, en realidad, no estoy agregando nada nuevo, pero pensé que mencionaría que la referencia que proporcionó: https://www.liferay.com/web/thiago.moreira/blog/-/blogs/how-to-monitor-liferay-tomcat-remotely-through-firewalls-using-visualvm funcionó de inmediato (solo con ajustes menores relacionados con versiones más recientes - Tomcat 7 y VisualVM) 1.3.8). En mi caso, Tomcat se está ejecutando en CentOS 6.6, y la máquina de monitoreo es una Mac (quizás esto podría ayudar a alguien más). Gracias de nuevo.

Cuestiones relacionadas