java - monitorear - Conexión de la instancia de JMX remota de tomcat con jConsole
jmx tomcat 8 (12)
Estoy intentando conectarme a una instancia de JMX de tomcat remota utilizando jConsole. Pero no se puede conectar con éxito. ¿Alguna idea?
Incluí la siguiente opción en tomcat remoto catalina.sh
:
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"
Habilite JMX en Tomcat8, probado con éxito en mi POC
1 / Descargue catalina-jmx-remote.jar
del sitio web de apache y colóquelo en $CATALINA_HOME/lib
.
2 / Tome la copia de seguridad server.xml
/ setenv.sh
. Realice los cambios en server.xml
como server.xml
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
3 / Realice los cambios en $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 / Cree estos dos archivos como - $touch $CATALINA_BASE/conf/jmxremote.password
contiene:
admin letmein
$touch $CATALINA_BASE/conf/jmxremote.access
contiene:
readwrite de administrador
$ chmod 600 jmxremote.password
5 / Reinicia tomcat y prueba en la herramienta jconsole :)
$echo|telnet 10.105.14.90 10001
Intento con Java 8
1. Agregue esto a su script de inicio de java tomcat:
-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, agregue 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. Ejecuta esto en tu computadora.
Usuarios de Windows :
putty.exe -ssh user@remote-host -L 1616:remote-host:1616
Usuarios de Linux y Mac :
ssh user@remote-host -L 1616:remote-host:1616
3. Inicie jconsole
en su computadora
jconsole localhost:1616
4. ¡Diviértete!
- PD: durante el paso 2, al usar
ssh
y-L
, especifica que el puerto 1616 en el host local (cliente) se debe reenviar al lado remoto. - PS2 .: puedes especificar el mismo puerto para las conversaciones JMX y RMI
¿Qué quiere decir exactamente cuando dice "Pero no se puede conectar con éxito"? ¿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 de jconsole, edite un archivo llamado logging.properties en el directorio en el que ejecutará jconsole, agregue:
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
Luego, inicie jconsole con:
jconsole -J-Djava.util.logging.config.file=logging.properties
Al cambiar el /etc/hosts
en linux, donde reemplacé la dirección de /etc/hosts
local asociada a mi cuenta a la máquina IP, este problema se solucionó para mí.
Bueno, tuve este problema en una caja de Linux (máquina virtual) y lo arreglé usando la propiedad -Djava.rmi.server.hostname, pero hay algo 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. Sin cortafuegos, propiedad no -Djava.rmi.server.hostname en cualquier tomcat ....
Entonces, el problema es que entiendo el problema, pero no puedo entender por qué 4 de mis gatos funcionaron y 1 de ellos no.
PD: Mi inglés es muy pobre, lo sé. Mis disculpas.
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.
agrega la línea en ti {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"
PROTIP: debe corregir (como tener un número conocido) los puertos del Registro RMI y del Servidor JMX / RMI. Para ello, ponga jar-file en lib-dir y configure un listener especial. (Y por supuesto las banderas usuales para activar 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 Remote Lifecycle Listener en http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html
Recopilé información en la red, encontrada con sugerencias de otros miembros.
La mayoría 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:
use tomcat 6.0.24 o una versión más nueva descarga catalina-jmx-remote.jar de apache tomcat extras (use browse en la página de descarga de tomcat) cópielo en $ CTALINA_HOME / lib
Esto le permite establecer ambos puertos utilizados por JMX
editar la sección Servidor en su server.xml
<Server port="8005" ..>
...
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>
establecer algunas variables de entorno (por ejemplo, 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.access se verá como
monitorRole readonly
controlRole readwrite
end jmxremote.password será
monitorRole tomcat
controlRole tomcat
(solo espacios simples)
reiniciar Tomcat.
Ahora configura el firewall 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
reiniciar iptables
¡Hecho!
Ahora use 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.
Tengo algo para todos ustedes, para 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
al mismo valor de la propiedad llamada 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 http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/ esto: http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/
Espero contribuir chicos!
¡Y buena suerte!
Tuve 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. Entonces, como se sugirió en .com/questions/151238/… , agregué lo siguiente:
-Djava.rmi.server.hostname=<host ip>
a JAVA_OPTS
también, y luego funcionó.
qué cadena estás usando 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 ve así:
service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi
si está trabajando en Linux, modifique el archivo catalina.sh agregando:
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 modifique el archivo / etc / profile como root y vuelva a ejecutar el archivo (fuente / etc / profile)
si está trabajando en Windows y está iniciando tomcat desde la línea de comando, use la variable de entorno CATALINA_OPTS
si está trabajando en Windows y está iniciando tomcat como un servicio, necesitará usar la utilidad de servicio del monitor para configurar los parámetros de inicialización del servicio (ni setenv.bat, catalina.bat ni 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 icono 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
Espero eso ayude