2012-09-07 14 views
5

Scusate se questa è una ripetizione di una domanda posta in precedenza, ma ho provato le soluzioni fornite qui e altrove e nessuna sembra funzionare per me.Monitoraggio remoto di un server Tomcat 7 con VisualVM e SSH

Scenario: Devo profilare un server Tomcat 7 di produzione che si trova dietro un firewall. Ho solo accesso SSH a questo server. Lo strumento di profilazione scelto è Visualvm e questi server non hanno una GUI installata. Sia il server che la macchina che sto cercando di connettersi eseguono il server LTS di Ubuntu 10.04.

Possibile soluzione: Usando VisualVM sopra tunnel SSH sembra possibile e il link indicato di seguito fornisce una guida abbastanza dettagliata per fare questo:

Tomcat+VisualVM+SSH guide

Inoltre ho aggiunto un file jmxremote.access al dir/conf in Tomcat con le seguenti due righe:

monitorRole readonly 
controlRole readwrite 

Problema: ho seguito passo s fornito nell'articolo e tutto sembra andare bene. Posso connettermi alle porte jmx nel server localmente (dal server) usando jmxterm e la stringa di connessione fornita nella guida.

Ho configurato tomcat locale come da guida come test e Visualvm non ha avuto problemi a connettersi a questa istanza di tomcat utilizzando la stringa di connessione.

Tuttavia, VisualVM non si collegherà al server remoto tramite il tunnel SSH. Ho provato JConsole quanto più semplice e ha una migliore funzionalità di registrazione e ottengo la seguente sequenza di messaggi:

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 

Tutte le idee su ciò che ho fatto di sbagliato qui? Qualsiasi aiuto è molto apprezzato!

Grazie.

risposta

2

Penso che il problema riscontrato, a cui l'articolo di riferimento non si riferisce in realtà, è il modo in cui funziona jmx-rmi o, più specificamente, RMI. La configurazione del server Tomcat come questo:

  1. creato un remotabile RMI che è configurato per la connessione a localhost: 12009.
  2. Creato un registro RMI su localhost con una porta di ascolto di localhost: 12008.

Quando si esegue a livello locale, si ricerca il mozzicone nel Registro di RMI, e quando si richiama contro lo stub per emettere una chiamata JMX, si connette a localhost: 12009, nessun problema.

Quando si esegue in remoto tramite SSH, io parto dal presupposto che avete tunnel dal telecomando per il server Tomcat sulla porta 12008, in modo che quando si emette la richiesta, il tuo del telecomandolocalhost:12008 è incanalato per tomcatServer:12008 poiché l'uscita del registro sembra indica che hai trovato lo stub ok.

Successivamente, il telecomando esegue lo stub che a sua volta tenta di connettersi a localhost:12009 e non riesce.

La mia ipotesi è che avete bisogno di tunnel localhost del telecomando: 12008 e localhost: 12009 per essere reindirizzati al tomcatServer: 12008 e tomcatServer: 12009.

Un altro modo per aggirare questo è di abbandonare il protocollo JMX RMI e usare qualcosa come Jolokia (HTTP), JMX-WS (HTTP WebService) o JMXMP (Socket). Questo renderà la tua vita di tuning SSH molto più facile. Se vuoi provare JMXMP, ho creato un progetto github chiamato OpenDMK che ha build mavenized. Vorresti il ​​pacchetto jmx-optional.

+0

Nicholas, grazie per la risposta. Ho sia localhost: 12008 e localhost: 12009 tunneled alle porte corrispondenti sul server tomcat. Semplicemente non funziona. Ho seguito il tuo suggerimento per provare JMXMP e funziona magnificamente. Grazie. – ChamaraG

0

Grazie per la tua domanda! - Avevo lo stesso bisogno di base. Scusa, non sto aggiungendo nulla di nuovo qui, ma ho pensato di menzionare che il riferimento che hai fornito: https://www.liferay.com/web/thiago.moreira/blog/-/blogs/how-to-monitor-liferay-tomcat-remotely-through-firewalls-using-visualvm ha funzionato subito per me (con aggiustamenti solo minimi collegati solo a versioni più recenti: Tomcat 7 e VisualVM 1.3.8). Nel mio caso Tomcat è in esecuzione su CentOS 6.6 e la macchina di monitoraggio è un Mac (forse questo potrebbe aiutare qualcun altro là fuori). Grazie ancora.