eclipse: удаленная отладка сервера tomcat за брандмауэром
после запуска tomcat с jpda on, в то время как в моей компании я могу удаленно отлаживать кучу веб-приложений в eclipse. По ряду причин я сейчас нуждаюсь в разработке и удаленной отладке тех же webapps из-за пределов брандмауэра компании, и я могу получить доступ к этому серверу только через ssh на порту 22.
Я туннелировал наиболее необходимые порты (svn, nexus, tomcat, с сервера или через сервер) на localhost, и эти службы работают нормально, но я не могу запустить eclipse отладчик в любом случае; я получаю "время ожидания соединения во время ожидания пакета XXX" или "соединение отказано" со второго раза, когда я пытаюсь. Проверяя с nmap на сервере, он сообщает, что порт открыт до первой попытки подключения, и после этого он закрывается. Я не получаю интересного выходного журнала в catalina.вон!--10-->
команда, которую я использую для запуска туннеля:
ssh -L 8000:localhost:8000 user@mycompany.com
iptables был временно остановлен как на сервере, так и на локальной машине для тестирование.
Я что-то пропустила? Нужно ли пересылать какой-то другой порт в localhost? Или это каким-то образом связано с разрешением имен?
редактировать
открыть порты перед подключением attemp от 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)
и после:
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)
точная ошибка eclipse возвращается:
Exception occurred during launch
Failed to connect to remote JVM. Connection timed out.
Timeout occurred while waiting for packet 204.
(номер пакета изменяется при каждой попытке).
на workspace/.metadata/.log
i получить:
!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 настроен для прямого подключения к интернету.
Изменить 2
Я думаю, что решение может быть здесь:
http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/
но у меня есть некоторые проблемы с пониманием его настроек JNDI/RMI и в какой степени это относится к моей конфигурации.
правка 3
это разъяснение для тех, кто отвечает " использовать <lan|local ip address>
вместо <localhost>
"
- компьютер A: моя рабочая станция в компании
- компьютер B: моя рабочая станция дома
- компьютер C: сервер под управлением tomcat
B и C находятся в двух разных подсетях в одной и той же сетевой инфраструктуре; разрешены только подключения к порту 22 C извне (и несколько "проксированы", я не знаю внутренних сетей).
A " снаружи" (мое dsl-соединение с динамическим ip-адресом).
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 ответов
в этой статье предполагает, что порт по умолчанию, на котором удаленная виртуальная машина Java (JVM) прослушивает в режиме отладки, - 1044. Вы должны туннелировать порт, на котором работает удаленный JVM.
в более общем плане вы можете запустить wireshark / tcpdump, чтобы увидеть, к какому порту предпринимаются попытки подключения при запуске отладчика.
редактировать:
еще несколько вещей, которые я хотел попробуйте:
- проверьте удаленный хост (например, с
ps auxwww
Если это Linux) с какими аргументами (посмотрите, что стоит за-Xrunjdwp
илиlsof -p PID_OF_JVM_TO_BE_DEBUGGED
на каком TCP-порту он слушает (ищите строки сTCP
иLISTEN
наlsof
выход) - убедитесь, что JVM на удаленном хосте прослушивает
lo
интерфейс, а не сетевой интерфейс (это то, что вы указываете с помощьюlocalhost
на-L
опция ssh). - не начинать отладчик вручную на машине, где вы начинаете eclipse с
jdb -attach localhost:8000
работы ? (вы также можете попробовать это на удаленном хосте, чтобы убедиться, что отладчик работает на порту 8000) - убедитесь, что Eclipse пытается подключиться к
localhost
(если не указать адрес привязки перед первым 8000 с-L
опция ssh прослушиваетlo
интерфейс)
Я часто была эта проблема при выполнении удаленной отладки. Я не знаю точной причины этой проблемы, но я использовал приведенное ниже решение, и, возможно, оно работает и для вас:
вместо
ssh -L 8000:localhost:8000 user@remotehost
используется
ssh -L 8000:remotehost:8000 user@remotehost
для создания туннеля SSH (обратите внимание на remotehost вместо localhost между номерами портов во втором примере). Вместо имени удаленного хоста можно также использовать обычный IP-адрес удаленного хоста (а не петлю адрес 127.0.0.1, но истинный IP-адрес локальной сети).
надеюсь, что это помогает и удачи!
предполагая, что удаленный экземпляр Tomcat был запущен с чем-то вроде -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n
попробуйте эту команду:
ssh -L 8000:0.0.0.0:8000 user@mycompany.com -N
на моем Mac, я пробовал ssh -L 10701:localhost:10700 user@localhost -N
локально, где экземпляр Tomcat был запущен с -Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=n
, и пытаясь подключиться к порту 10701 в Eclipse, я продолжал видеть " не удалось подключиться к удаленному VM com.солнце.фирмой JDI.соединять.спи.ClosedConnectionException". Изменив команду туннеля на ssh -L 10701:0.0.0.0:10700 user@localhost -N
, Eclipse смог подключиться.
не могли бы вы указать точные параметры параметра-Xrunjdwp?
также вы пробовали разные методы отладки (server=y/n, suspend=y / n)?
возможно, инвертирование соединения (пусть tomcat подключается к отладчику, а не позволяет отладчику подключаться к tomcat) может помочь.
Ну, я отвечаю себе через долгое время; в моем конкретном случае решением было поставить eclipse JVM в режим прослушивания:
Connection Type: "Standard (Socket Listen)"
и изменить направление туннеля:
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)
некоторое объяснение: как и в вопросе, моя ситуация была:
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
при движении задним ходом такой:
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
сделал свое дело. Другими словами, все, что написано на S: 8001, пересылается на W:8001, а все, что, в свою очередь, записывается на W:8001, является перенаправлено на H: 8001, где слушает мой eclipse JVM.
tomcat JVM на S следует запускать с server=n, с аргументами:
-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=8001