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í:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Al menos el putty.exe
2. Defina un puerto libre en su máquina Linux:
<jmx-remote-port>
Ejemplo:
jmx-remote-port = 15666
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).
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
Ejemplo:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main
4. Obtenga el Id. De proceso de su proceso Java
ps -ef | grep <java-processname>
result ---> <process-id>
Ejemplo:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
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 encontrar lsof -i
pistas sobre qué puerto se ha abierto desde el proceso java.
NOTA: Este puerto siempre cambia cuando se inicia el proceso de Java.
netstat -lp | grep <process-id>
tcp 0 0 *:<jmx-remote-port> *:* LISTEN 24321/java
tcp 0 0 *:<rmi-server-port> *:* LISTEN 24321/java
result ---> <rmi-server-port>
Ejemplo:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Habilite dos túneles SSH desde su máquina Windows con masilla
Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local
[x] Auto
Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local
[x] Auto
Ejemplo:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
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:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
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.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Ejemplo:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. DISFRUTE # 8-]