eclipse: débogage à distance d'un serveur tomcat derrière un pare-feu
après avoir démarré tomcat avec jpda on, je peux déboguer à distance un tas d'applications web dans eclipse. Pour un certain nombre de raisons, j'ai maintenant besoin de développer et de déboguer à distance ces mêmes webapps depuis l'extérieur du pare-feu de la société, et je ne peux accéder à ce serveur que via ssh sur le port 22.
j'ai tunnel les ports les plus nécessaires (svn, nexus, tomcat lui-même, à partir du serveur ou via le serveur) vers localhost et ces services fonctionnent bien, mais je ne peux pas démarrer l'éclipse débogueur en aucune façon; je suis "connection timed out en attendant paquet XXX" ou "connexion refusée" à partir de la deuxième fois que j'essaie. En vérifiant avec nmap sur le serveur, il signale le port ouvert avant la première tentative de connexion, et il se ferme après cela. Je n'ai pas de journal de sortie intéressant à catalina.
La commande que j'utilise pour démarrer le tunnel est:
ssh -L 8000:localhost:8000 user@mycompany.com
iptables a été temporairement arrêté à la fois sur le serveur et sur la machine locale pour test.
est-ce que je rate quelque chose? Dois-je envoyer un autre port à localhost? Ou s'agit-il en quelque sorte de résolution de nom?
EDIT
Ouvrir les ports avant de tenter de connexion à partir d'eclipse:
root@lnxulisse:/opt/apache-tomcat-6.0.32/bin# lsof -p 2147 -n |grep TCP
java 2147 root 4u IPv4 640850 0t0 TCP *:8000 (LISTEN)
java 2147 root 38u IPv6 640859 0t0 TCP *:http-alt (LISTEN)
java 2147 root 40u IPv6 640865 0t0 TCP *:https (LISTEN)
java 2147 root 46u IPv6 640908 0t0 TCP 127.0.0.1:18005 (LISTEN)
java 2147 root 48r IPv6 642625 0t0 TCP 172.24.0.82:48347->172.24.0.82:mysql (ESTABLISHED)
java 2147 root 181u IPv6 640891 0t0 TCP 172.24.0.82:60353->172.24.0.82:mysql (ESTABLISHED)
et après:
java 2147 root 4u IPv6 642769 0t0 TCP 172.24.0.82:48956->172.24.0.82:mysql (ESTABLISHED)
java 2147 root 5u IPv4 640851 0t0 TCP 127.0.0.1:8000->127.0.0.1:34193 (ESTABLISHED)
java 2147 root 38u IPv6 640859 0t0 TCP *:http-alt (LISTEN)
java 2147 root 40u IPv6 640865 0t0 TCP *:https (LISTEN)
java 2147 root 46u IPv6 640908 0t0 TCP 127.0.0.1:18005 (LISTEN)
java 2147 root 181u IPv6 640891 0t0 TCP 172.24.0.82:60353->172.24.0.82:mysql (ESTABLISHED)
exact eclipse erreur renvoyée est:
Exception occurred during launch
Failed to connect to remote JVM. Connection timed out.
Timeout occurred while waiting for packet 204.
(le numéro du paquet varie à chaque tentative).
workspace/.metadata/.log
je obtenir:
!ENTRY org.eclipse.osgi 2 0 2011-07-17 18:43:53.024
!MESSAGE While loading class "org.eclipse.core.net.proxy.IProxyService", thread "Thread[main,6,main]" timed out waiting (5000ms) for thread "Thread[Thread-6,5,main]" to finish starting bundle "org.eclipse.core.net_1.2.1.r35x_20090812-1200 [232]". To avoid deadlock, thread "Thread[main,6,main]" is proceeding but "org.eclipse.core.net.proxy.IProxyService" may not be fully initialized.
!STACK 0
org.osgi.framework.BundleException: State change in progress for bundle "reference:file:plugins/org.eclipse.core.net_1.2.1.r35x_20090812-1200.jar" by thread "Thread-6".
at org.eclipse.osgi.framework.internal.core.AbstractBundle.beginStateChange(AbstractBundle.java:1073)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:278)
[...]
!ENTRY org.eclipse.ui.ide 4 4 2011-07-17 18:43:53.028
!MESSAGE Proxy service could not be found.
eclipse est configuré pour une connexion internet directe.
EDIT 2
je pense que la solution serait peut-être ici:
http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/
mais j'ai du mal à comprendre ses paramètres JNDI/RMI, et dans quelle mesure cela s'applique à ma configuration.
EDIT 3
Ceci est un précisions pour ceux qui ont répondu "utiliser <lan|local ip address>
au lieu de <localhost>
"
- ordinateur: mon poste de travail dans l'entreprise
- ordinateur B: mon poste de travail à la maison
- C de l'ordinateur: serveur exécutant tomcat
B et C sont dans deux sous-réseaux différents dans la même infrastructure de réseau; seules les connexions vers le port 22 de C depuis l'extérieur sont autorisées (et quelque peu "approximées", Je ne sais pas les réseaux internes).
Une est "à l'extérieur" (ma connexion dsl avec adresse IP dynamique).
Debugging on C from B via ssh tunnel -> works
Debugging on C from A via ssh tunnel -> connection timed out while waiting for packet XXX
5 réponses
Cet article suggère que le port par défaut sur lequel la machine virtuelle Java distante (JVM) écoute en mode de débogage est 1044. Vous devez également creuser un tunnel sur le port sur lequel la JVM distante tourne.
plus généralement, vous pouvez lancer wireshark / tcpdump pour voir à quel port vous tentez de vous connecter lors du démarrage du débogueur.
EDIT:
quelques autres choses que je voudrais à essayer:
- vérifier sur l'hôte distant (par exemple,
ps auxwww
si C'est Linux) avec quels arguments (cherchez ce qui se trouve derrière-Xrunjdwp
oulsof -p PID_OF_JVM_TO_BE_DEBUGGED
sur quel port TCP il écoute (cherchez les lignes avecTCP
etLISTEN
dans lelsof
sortie) - assurez-vous que le JVM de l'hôte distant écoute le
lo
interface, pas l'interface réseau (c'est ce que vous spécifiez avec l'localhost
dans le-L
option vers ssh). - départ de la débogueur à la main sur la machine où vous démarrez eclipse
jdb -attach localhost:8000
travail ? (vous pouvez également essayer cela sur l'hôte distant pour vous assurer que le débogueur tourne sur le port 8000) - assurez-vous que eclipse tente de se connecter à
localhost
(lorsqu'on ne spécifie pas d'adresse de liaison avant les premiers 8000 avec le-L
l'option SSH écoute sur lelo
interface)
j'ai souvent eu ce problème lors de débogage à distance. Je ne connais pas la raison exacte de ce problème, mais j'ai utilisé ci-dessous la solution et ça marche peut-être pour vous aussi:
au lieu de
ssh -L 8000:localhost:8000 user@remotehost
ssh -L 8000:remotehost:8000 user@remotehost
pour la création du tunnel SSH (notez la remotehost au lieu de localhost entre les numéros de port dans le second exemple). Au lieu du nom de l'hôte distant, vous pouvez également utiliser l'adresse IP normale de l'hôte distant (pas le loopback adresse 127.0.0.1, mais la vraie adresse IP du réseau local).
J'espère que ça vous aidera et bonne chance!
en supposant que L'instance distante Tomcat a été lancée avec quelque chose comme -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n
, essayez cette commande:
ssh -L 8000:0.0.0.0:8000 user@mycompany.com -N
sur mon Mac, j'ai essayé ssh -L 10701:localhost:10700 user@localhost -N
localement, où une instance Tomcat a été commencée avec -Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=n
, et en essayant de se connecter sur le port 10701 dans Eclipse, j'ai continué à voir " Failed to connect to remote VM com.soleil.jdi.connecter.le spi.ClosedConnectionException". En remplaçant la commande tunnel par ssh -L 10701:0.0.0.0:10700 user@localhost -N
, Eclipse a pu se fixer.
pouvez-vous donner les paramètres exacts du paramètre-Xrunjdwp?
Aussi, ne vous ont essayé différentes méthodes pour le débogage (serveur=y/n, suspendre=y/n)?
peut-être d'inverser la connexion (laisser le tomcat se connecter au débogueur au lieu de laisser le débogueur se connecter à tomcat) peut aider.
Eh bien je me réponds après un long moment; dans mon cas précis, la solution était de mettre eclipse JVM en mode d'écoute:
Connection Type: "Standard (Socket Listen)"
et inversez la direction du tunnel:
ssh -L 8001:localhost:8001 user@work (run on server (S), "localhost" is W)
ssh -R 8001:localhost:8001 user@work (run at home (H), "localhost" is W)
quelques explications: comme dans la question, Ma situation était:
H -------------------> S not working ( ssh -L 8001:S:8001 user@S from H)
H W -------> S working ( ssh -L 8001:S:8001 user@S from W)
home work server
en inversant comme ceci:
H <------- W S ssh -R 8001:localhost:8001 user@W (from H)
H W <------- S ssh -L 8001:localhost:8001 user@W (from S)
home work server
a fait l'affaire. En d'autres termes, tout ce qui est écrit sur S:8001, est transmis à W:8001, et tout est écrit à W:8001, est transmis à H: 8001, où mon eclipse JVM écoute.
la JVM de tomcat sur S doit être lancée avec server=n, avec les arguments:
-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=8001