Parece que nunca he conseguido que esto funcione en el pasado. Actualmente, SÉ que no funciona.
Pero iniciamos nuestro proceso de Java:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Puedo hacer telnet al puerto, y "hay algo allí" (es decir, si no inicio el proceso, nada responde, pero si lo hago, lo hace), pero no puedo hacer que JConsole funcione completando la IP y puerto.
Parece que debería ser tan simple, pero sin errores, sin ruido, sin nada. Simplemente no funciona.
¿Alguien sabe el consejo para esto?
Respuestas:
Tengo una solución para esto:
Si su proceso Java se está ejecutando en Linux detrás de un firewall y desea iniciar JConsole / Java VisualVM / Java Mission Control en Windows en su máquina local para conectarlo al puerto JMX de su proceso Java .
Necesita acceder a su máquina Linux a través del inicio de sesión SSH. Toda la comunicación se canalizará a través de la conexión SSH.
SUGERENCIA: esta solución funciona sin importar si hay un firewall o no.
Desventaja: cada vez que reinicie su proceso de Java, deberá realizar todos los pasos del 4 al 9 nuevamente.
1. Necesita putty-suite para su máquina Windows desde aquí:
2. Defina un puerto libre en su máquina Linux:
Ejemplo:
3. Agregue argumentos al proceso java en la máquina Linux
Esto debe hacerse exactamente así. Si se hace como se muestra a continuación, funciona para máquinas Linux detrás de cortafuegos (funciona debido al
-Djava.rmi.server.hostname=localhost
argumento).Ejemplo:
4. Obtenga el Id. De proceso de su proceso Java
Ejemplo:
5. Busque un puerto arbitrario para la descarga de stubs de RMIServer
El proceso de java abre un nuevo puerto TCP en la máquina Linux, donde RMI Server-Stubs estará disponible para descargar. Este puerto también debe estar disponible a través de SSH Tunnel para obtener una conexión a la máquina virtual Java.
Con
netstat -lp
este puerto también se pueden encontrarlsof -i
pistas sobre qué puerto se ha abierto desde el proceso java.NOTA: Este puerto siempre cambia cuando se inicia el proceso de Java.
Ejemplo:
6. Habilite dos túneles SSH desde su máquina Windows con masilla
Ejemplo:
7. Inicie sesión en su máquina Linux con Putty con este SSH-Tunnel habilitado.
Deje abierta la sesión de masilla.
Cuando haya iniciado sesión, Putty conectará todas las conexiones TCP a la máquina Linux a través del puerto SSH 22.
Puerto JMX:
RMIServer-Stub-Port:
8. Inicie JConsole / Java VisualVM / Java Mission Control para conectarse a su proceso Java utilizando la siguiente URL
Esto funciona, porque JConsole / Java VisualVM / Java Mission Control cree que se conecta a un puerto en su máquina Windows local. pero Putty envía toda la carga útil al puerto 15666 de su máquina Linux.
En la máquina Linux, primero, el proceso java responde y devuelve el puerto RMIServer. En este ejemplo 37123.
Luego, JConsole / Java VisualVM / Java Mission Control cree que se conecta a localhost: 37123 y putty enviará toda la carga útil a la máquina Linux.
El proceso de Java responde y la conexión está abierta.
Ejemplo:
9. DISFRUTE # 8-]
fuente
Agregar
-Djava.rmi.server.hostname='<host ip>'
resolvió este problema para mí.fuente
Probado con Java 8 y versiones más recientes
Esta solución también funciona bien con firewalls.
1. Agregue esto a su script de inicio de Java en el host remoto:
2. Ejecute esto en su 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 computadora4. ¡Diviértete!
PD: durante el paso 2, use
ssh
y-L
especifique que el puerto 1616 en el host local (cliente) debe reenviarse al lado remoto. Este es un túnel ssh y ayuda a evitar firewalls o varios problemas de redes.fuente
Probablemente esté experimentando un problema con un firewall. El 'problema' es que el puerto que especifica no es el único puerto utilizado, utiliza 1 o tal vez 2 puertos más para RMI, y estos probablemente estén bloqueados por un firewall.
Uno de los puertos adicionales no se sabrá de antemano si usa la configuración RMI predeterminada, por lo que debe abrir una gran variedad de puertos, lo que puede que no divierta al administrador del servidor.
Hay una solución que no requiere abrir muchos puertos, sin embargo, la he hecho funcionar usando los fragmentos de código fuente combinados y los consejos de
http://forums.sun.com/thread.jspa?threadID=5267091- el enlace ya no funcionahttp://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
Incluso es posible configurar un túnel ssh y aun así hacer que funcione :-)
fuente
forums.sun.com
está rotoblogs.oracle.com
está roto.Después de poner a prueba mi Google-fu durante los últimos días, finalmente pude hacer que esto funcionara después de compilar las respuestas de Stack Overflow y esta página http://help.boomi.com/atomsphere/GUID-F787998C- 53C8-4662-AA06-8B1D32F9D55B.html .
Volver a publicar desde la página de Dell Boomi:
La única línea que no he visto ninguna cubierta de respuesta de Stack Overflow es
En mi caso, estaba intentando recuperar las métricas de Kakfa, así que simplemente cambié la opción anterior para que coincida con el
-Dcom.sun.management.jmxremote.port
valor. Entonces, sin autenticación de ningún tipo, la configuración mínima debería tener este aspecto:fuente
¿Está ejecutando Linux? Quizás el agente de administración esté vinculado a localhost:
http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1
fuente
Los pasos 4 a 7 de Sushicutta se pueden omitir agregando la siguiente línea al paso 3:
Por ejemplo, agregar para iniciar los parámetros:
Para el reenvío de puertos, conéctese usando:
Si su host es un trampolín, simplemente encadene el puerto hacia adelante ejecutando lo siguiente en el escalón después de lo anterior:
Cuenta que el nombre de host = localhost es necesario para asegurarse de que el jmxremote está diciendo la conexión RMI para utilizar el túnel. De lo contrario, podría intentar conectarse directamente y atacar el firewall.
fuente
ssh -L <JMX_port>:localhost:<JMX_port> <remote_user>@<remote_host>
en la máquina local (3) Luego me conecto a JMX remoto usando:jconsole <remote_host>:<JMX_port>
PROTIP:
El puerto RMI se abre en puertos arbitrarios. Si tiene un firewall y no desea abrir los puertos 1024-65535 (o usar vpn), debe hacer lo siguiente.
Necesita arreglar (como si tuviera un número conocido) el Registro RMI y los puertos del servidor JMX / RMI. Para hacer esto, coloque un archivo jar (catalina-jmx-remote.jar está en el extra) en el lib-dir y configure un oyente especial en el servidor:
(Y, por supuesto, las banderas habituales para activar JMX
Consulte: Escucha del ciclo de vida remoto de JMX en http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html
Entonces puedes conectarte usando esta horrible URL:
fuente
Compruebe si su servidor está detrás del firewall. JMX se basa en RMI, que abre dos puertos cuando se inicia. Uno es el puerto de registro, el valor predeterminado es 1099 y se puede especificar mediante la
com.sun.management.jmxremote.port
opción. El otro es para la comunicación de datos y es aleatorio, que es lo que causa el problema. Una buena noticia es que, desde JDK6, este puerto aleatorio se puede especificar mediante lacom.sun.management.jmxremote.rmi.port
opción.fuente
Pasar JMX a través del Firewall es realmente difícil. El problema es que RMI estándar usa un segundo puerto asignado aleatoriamente (al lado del registro RMI).
Tenemos tres soluciones que funcionan, pero cada caso necesita una diferente:
JMX sobre SSH Tunnel con proxy Socks, utiliza RMI estándar con SSH magic http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html
JMX MP (alternativa al RMI estándar), usa solo un puerto fijo, pero necesita un jar especial en el servidor y el cliente http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/
Inicie el código de formulario del servidor JMX, allí es posible usar RMI estándar y usar un segundo puerto fijo: https://issues.apache.org/bugzilla/show_bug.cgi?id=39055
fuente
Al probar / depurar / diagnosticar problemas remotos de JMX, primero intente siempre conectarse en el mismo host que contiene el MBeanServer (es decir, localhost), para descartar la red y otros problemas no específicos de JMX.
fuente
Ya hay algunas respuestas geniales aquí, pero hay un enfoque un poco más simple que creo que vale la pena compartir.
El enfoque de sushicutta es bueno, pero es muy manual, ya que debe obtener el puerto RMI cada vez. Afortunadamente, podemos solucionarlo utilizando un proxy SOCKS en lugar de abrir explícitamente los túneles del puerto. La desventaja de este enfoque es que la aplicación JMX que ejecuta en su máquina debe poder configurarse para usar un Proxy. En la mayoría de los procesos puede hacer esto agregando propiedades de Java, pero algunas aplicaciones no lo admiten.
Pasos:
Agregue las opciones de JMX al script de inicio para su servicio Java remoto:
Configure una conexión de proxy SOCKS a su máquina remota:
Configure su aplicación de monitoreo de Java local para usar el proxy SOCKS (localhost: 9696). Nota: a veces puede hacer esto desde la línea de comando, es decir:
fuente
Lo siguiente funcionó para mí (aunque creo que el puerto 2101 realmente no contribuyó a esto):
Me estoy conectando desde una máquina remota a un servidor que tiene Docker en ejecución y el proceso está dentro del contenedor. Además, detuve el firewallD, pero no creo que ese fuera el problema, ya que podía hacer telnet a 2100 incluso con el firewall abierto. Espero eso ayude.
fuente
Estoy ejecutando JConsole / JVisualVm en Windows con conexión a tomcat que ejecuta Linux Redhat ES3.
Desactivar el filtrado de paquetes con el siguiente comando funcionó para mí:
donde jconsole-host es el nombre de host o la dirección de host en la que se ejecuta JConsole y jmxremote-port es el número de puerto configurado para com.sun.management.jmxremote.port para la administración remota.
fuente
Estoy usando boot2docker para ejecutar contenedores Docker con Tomcat adentro y tengo el mismo problema, la solución fue:
-Djava.rmi.server.hostname=192.168.59.103
docker run ... -p 9999:9999 ...
. El uso de puertos diferentes no funciona.fuente
También debe asegurarse de que el nombre de su máquina se resuelva en la IP a la que se vincula JMX; NO localhost ni 127.0.0.1. Para mí, ha ayudado a poner una entrada en hosts que defina explícitamente esto.
fuente
Pasar JMX a través del firewall no es tan difícil en absoluto. Hay una pequeña trampa. Tienes que reenviar tanto tu puerto configurado JMX, es decir. 9010 y uno de los puertos dinámicos que escucha en mi máquina era> 30000
fuente
Estos son los pasos que funcionaron para mí (debian detrás del firewall en el lado del servidor, alcanzado a través de VPN desde mi Mac local):
comprobar la ip del servidor
utilizar parámetros de JVM:
ejecutar la aplicación
encontrar el pid del proceso java en ejecución
comprobar todos los puertos utilizados por JMX / RMI
abra todos los puertos del paso 5 en el firewall
Voila.
fuente
Para hacer una contribución, esto es lo que hice en CentOS 6.4 para Tomcat 6.
Apagar el servicio iptables
Agregue la siguiente línea a tomcat6.conf
De esta manera pude conectarme desde otra PC usando JConsole.
fuente
Estoy intentando que JMC ejecute Flight Recorder (JFR) para perfilar NiFi en un servidor remoto que no ofrece un entorno gráfico en el que ejecutar JMC.
Basado en las otras respuestas dadas aquí, y luego de muchas pruebas y errores, esto es lo que estoy proporcionando a la JVM ( conf / bootstrap.conf ) cuando lanzo NiFi:
Puse esto en / etc / hosts , aunque dudo que sea necesario:
Luego, al iniciar JMC, creo una conexión remota con estas propiedades:
Por cierto, si hago clic en la URL del servicio JMX personalizado, veo:
Esto finalmente lo hizo por mí.
fuente