2009-08-12 22 views
55

Estoy intentando conectarme a una instancia de JMX remota de tomcat con jConsole. Pero no se puede conectar con éxito. ¿Alguna idea?Conexión de la instancia de JMX de tomcat remoto con jConsole

que incluía la siguiente opción en Tomcat remota catalina.sh: "Pero no se puede conectar con éxito"

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote \ 
    -Dcom.sun.management.jmxremote.port=9004 \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -Dcom.sun.management.jmxremote.authenticate=false" 
+0

¿Está ejecutando una versión empaquetada de Tomcat o ¿Ha instalado de forma manual? Una cosa más, ¿puedes pegar el error completo? –

+0

Pregunta similar: https://stackoverflow.com/questions/151238/has-anyone-ever-got-a-remote-jmx-jconsole-to-work – Vadzim

Respuesta

2

¿Qué es exactamente lo que quiere decir cuando se dice? ¿Hay un mensaje de error? Intente encender el inicio de sesión en jconsole y vea si eso ayuda a depurarlo.

Para activar el registro jconsole, editar un archivo logging.properties nombrados en el directorio que va a correr en jconsole, añadir:

handlers= java.util.logging.ConsoleHandler 

.level=INFO 

java.util.logging.FileHandler.pattern = %h/java%u.log 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter 

java.util.logging.ConsoleHandler.level = FINEST 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

javax.management.level=FINEST 
javax.management.remote.level=FINEST 

A continuación, comenzar con jconsole:

jconsole -J-Djava.util.logging.config.file=logging.properties 
+0

Joe, recibo la siguiente excepción. Haciendo caso omiso de error de registro sugerir cuál es el problema \t en com.sun.jmx.remote.util.ClassLogger.finer (ClassLogger.java:130) \t en com.sun.jmx.remote.util.ClassLogger.trace (ClassLogger. java: 88) \t en javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:245) \t en javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:227) \t al sol .tools.jconsole.ProxyClient.tryConnect (ProxyClient.java:334) \t en sun.tools.jconsole.ProxyClient.connect (ProxyClient.java:296) \t en sun.tools.jconsole.VMPanel $ 2.run (VMPanel. java: 280) – Niger

+0

Sorr y, tuve un error tipográfico en el texto logging.properties. Edité mi publicación, intenté hacer ese archivo nuevamente y ver si puedes obtener alguna información de depuración. –

+0

No, no podemos ver los registros. ¿Dónde creó esto los registros? –

63

I tuvo un problema similar, si no el mismo. Podría conectarme al servidor JMX si comencé jconsole localmente en la máquina.

Parece que el servidor RMI no estaba escuchando en la dirección IP correcta. Por lo tanto, como se sugirió en this related question, añadí lo siguiente:

-Djava.rmi.server.hostname=<host ip> 

a JAVA_OPTS así, y luego funcionó.

+0

Muchas gracias. Eso es lo que necesitaba. – Conor

+1

Funcionó para mí Acabo de establecer el host de la IP a 127.0.0.1 y funcionó para mí en mi máquina local. – rado

+0

¿Agregamos esto a JAVA_OPTS del servidor o máquina local JAVA_OPTS? –

8

qué cadena está utilizando como la URL de conexión JMX. No me refiero a señalar lo obvio, pero JConsole tiene una interfaz terrible y para mí requiere una url demasiado compleja antes de que se conecte a una aplicación remota de jmx. El mío se parece a esto:

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi 
0

Cambio de la /etc/hosts en Linux, en el que sustituyó a la dirección de localhost asociada a mi cuenta a la dirección IP del equipo, resuelto este problema para mí.

35

He recopilado información distribuida en la red, que se encuentra con sugerencias de otros miembros.

La mayor parte del dolor causado por JMX es (imo) el hecho de que JMX abre un segundo puerto de red asignado dinámicamente. Un firewall (como iptables) bloqueará esto.

Solución para Tomcat en Linux:

uso Tomcat 6.0.24 o posterior descarga catalina-jmx-remote.jar de extras Apache Tomcat (el uso de exploración en la página descarga Tomcat) copiarlo en el CTALINA_HOME $ \ lib

Esto le permite configurar los dos puertos utilizados por JMX

sección servidor de edición en su server.xml

<Server port="8005" ..> 
    ... 
    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/> 

establece algunas variables de entorno (p. en setenv.sh)

CATALINA_OPTS=" 
    -Djava.rmi.server.hostname=IP-TO-LISTEN 
    -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password 
    -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access 
    -Dcom.sun.management.jmxremote.ssl=false" 

esto activa el control de acceso para JMX

jmxremote.el acceso se verá como

monitorRole readonly 
controlRole readwrite 

jmxremote.password final será

monitorRole tomcat 
controlRole tomcat 

(sólo espacios simples)

Tomcat reinicio.

Ahora configurar servidor de seguridad en el servidor (por ejemplo, iptables)

/etc/sysconfig/iptables

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT 
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT 

y/etc/sysconfig/ip6tables

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT 
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT 

iptables restart

¡Hecho!

Ahora usa VisualVM o JConsole en su estación de trabajo para establecer una conexión con rmiRegistryPortPlatform, 9840 en nuestra muestra.

Si no hay más servidores de seguridad entre la estación de trabajo y el servidor debería funcionar.

+0

+1 arrastre en todas partes para esta información, funciona muy bien – Aitch

+3

+1 ¡gracias! funcionó muy bien! Solo tuve que agregar otra línea: '-Djava.rmi.server.hostname = '. –

+0

¿Debería ser también '-Dcom.sun.management.jmxremote.port = 9840' en tomcat.conf? –

0

Bueno, yo tenía este problema en una máquina Linux (máquina virtual) y me fijo utilizando la propiedad -Djava.rmi.server.hostname pero hay una cosa que no puedo entender. Mi máquina tiene 5 servidores tomcat, todos tienen habilitado jmx en puertos consecutivos (8008,8018,8028 ...) y solo uno de ellos tenía este problema conectando JMX. No servidor de seguridad, no -Djava.rmi.server.hostname propiedad en cualquier tomcat ....

Así que la cosa es que entiendo el problema, pero no puedo entender por qué 4 de mis gatos funcionaron y 1 de ellos no .

P.D: Mi inglés es muy pobre, lo sé. Mis disculpas.

0

Protip: Es necesario corregir (como en tener un número conocido) el registro RMI y los puertos del servidor JMX/RMI. Para ello, ponga jar-file en lib-dir y configure un listener especial. (Y por supuesto las banderas habituales para la activación de JMX

-Dcom.sun.management.jmxremote \ 
    -Dcom.sun.management.jmxremote.port=8999 \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -Dcom.sun.management.jmxremote.authenticate=false \ 
    -Djava.rmi.server.hostname=<HOSTNAME> \ 

Ver: JMX Oyente del ciclo de vida en el remoto http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

2

si está trabajando en Linux, modificar el archivo catalina.sh añadiendo:

   CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<HOST_IP> -Dcom.sun.management.jmxremote.port=<HOST_PORT> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" 
      export CATALINA_OPTS 

o modificar el archivo/etc/profile como root y vuelva a ejecutar el archivo (source/etc/profile)

si está trabajando en windows y va a iniciar Tomcat de Th línea de comandos e, utilice el medio ambiente CATALINA_OPTS variables

si está trabajando en Windows y va a iniciar Tomcat como un servicio, tendrá que utilizar la utilidad del servicio de monitor para configurar los parámetros de inicialización del servicio (ni setenv.bat , catalina.bat o env-vars funcionarán). para eso necesitará el nombre del servicio que aparece listado en services.msc (por ejemplo, jasperreportsTomcat). Después, deberá abrir una consola como administrador y ejecutar (por ejemplo): tomcat6w.exe // MS // jasperreportsTomcat

con este comando aparecerá un ícono de bandeja donde puede abrir un panel. En la pestaña "Java" ahora puede modificar las opciones de jmx. Tenga cuidado de no agregar espacios en blanco al final y use el símbolo "[enter]" para separar cada opción línea por línea.

-Dcom.sun.management.jmxremote 
-Djava.rmi.server.hostname=192.168.61.101 
-Dcom.sun.management.jmxremote.port=9999 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 

creo que sirve

1

Tengo algo para todos ustedes, con el fin de completar la investigación de todo esto. Hay un truco, sucede que la herramienta del generador de perfiles se conecta con el jvm usando un puerto, pero el jvm continúa la conversación usando otro puerto aleatorio. Si el jvm se ejecuta dentro de una máquina remota (por ejemplo: un servidor de aplicación web tomcat) y la máquina remota tiene protección contra conexiones salientes y entrantes, debe establecer la propiedad del sistema java com.sun.management.jmxremote.rmi.port en el mismo valor de la propiedad denominada com.sun.management.jmxremote.port

Fuente: https://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error Y también mira esto: http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

la esperanza de contribuir chicos!

¡Y buena suerte!

1

Compruebe si su servidor está detrás del firewall. JMX está basado en RMI, que abre dos puertos cuando comienza. Uno es el puerto de registro, el valor predeterminado es 1099 y se puede especificar mediante la opción com.sun.management.jmxremote.port. El otro es para la comunicación de datos, y es aleatorio, que es lo que causa el problema. Una buena noticia es que, a partir de JDK6, este puerto aleatorio se puede especificar mediante la opción com.sun.management.jmxremote.rmi.port.

añadir la línea en que {} TOMCAT_DIR /bin/setenv.sh:

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" 
10

Probado con Java 8

1. Añadir esto a su Tomcat Java Script de inicio:

-Dcom.sun.management.jmxremote.port=1616 
-Dcom.sun.management.jmxremote.rmi.port=1616 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.local.only=false 
-Djava.rmi.server.hostname=localhost 

por ejemplo añadir en bin/setenv.sh esto:

export CATALINA_OPTS="$CATALINA_OPTS \ 
-Dcom.sun.management.jmxremote.port=1616 \ 
-Dcom.sun.management.jmxremote.rmi.port=1616 \ 
-Dcom.sun.management.jmxremote.local.only=true \ 
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false " 

2. Ejecute esto en su computadora.

3. Iniciar jconsole en su ordenador

jconsole localhost:1616 

4. Que se diviertan!

  • P.S.: durante el paso 2, utilizando ssh y -L, especifica que el puerto 1616 en el host local (cliente) se debe reenviar al lado remoto.
  • P.S.2 .: puede especificar mismo puerto para JMX y RMI conversaciones
+0

Gracias fue capaz de ejecutar rmiregistry y rmicomm en un mismo puerto. Esto funciona sin tomcat/conf/server.xml JMXRemoteLifecycleListener. ¿Hay algún problema que debe tenerse en cuenta si no se usa ese oyente? – Whome

+0

@Whome Lo siento, me perdí tu comentario. No, en mi experiencia no hay indicaciones contrarias. – freedev

3

Habilitar JMX en Tomcat8, probado con éxito en mi POC

1/Descarga la catalina-jmx-remote.jar desde el sitio Web Apache y lugar en $CATALINA_HOME/lib.

2/Take server.xml/setenv.sh de respaldo. Realice los cambios en server.xml como continuación-

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /> 

3/lo hacen para $CATALINA_BASE/bin/setenv.sh como -

[...] 

JVM_OPTS="[...] 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=true 
-Djava.rmi.server.hostname=<eth:0_IP>| <`hostname -i`> 
-Dcom.sun.management.jmxremote.password.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.access 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote=true " 

4/Crear estos dos archivos como - $touch $CATALINA_BASE/conf/jmxremote.password que contiene:

de administración letmein

$touch $CATALINA_BASE/conf/jmxremote.access que contiene:

administrador de lectura-escritura

$ chmod 600 jmxremote.password 

5/Tomcat Reiniciar y prueba en la herramienta jconsole :)

$echo|telnet 10.105.14.90 10001 
Cuestiones relacionadas