通过ssh隧道转发端口9000的xdebug远程调试 - 如何使其工作?

soo*_*oot 7 php xdebug eclipse-pdt

我在Amazon EC2云中的"Amazon Linux"(Centos派生的)32位实例上运行XAMPP 1.7.3a.我下载/构建/安装了XDEBUG 2.1.0.phpinfo()输出中的相关项如下所示:

Directive                         Local Value  Master Value
xdebug.idekey                     ECLIPSE_DBGP ECLIPSE_DBGP
xdebug.default_enable             On           On
xdebug.remote_autostart           On           On
xdebug.remote_connect_back        Off          Off
xdebug.remote_cookie_expire_time  3600         3600
xdebug.remote_enable              On           On
xdebug.remote_handler             dbgp         dbgp
xdebug.remote_host                127.0.0.1    127.0.0.1
xdebug.remote_mode                req          req
xdebug.remote_port                9000         9000
xdebug.remote_log                 /opt/lampp/logs/xdebug_log
                                               /opt/lampp/logs/xdebug_log
Run Code Online (Sandbox Code Playgroud)

我使用PuTTY版本0.60中的SSH客户端从运行XP SP3的Windows笔记本电脑访问Linux机器.另外在笔记本电脑上我已经安装了Eclipse PDT(Helios Service Release 1 Build id:20100917-0705),我想我已经正确配置了使用端口9000进行XDEBUG远程调试.我说我,因为我'很难弄清楚如何做到这一点,以及如何使用Eclipse PDT.但我确实设法配置并使用端口9000在localhost(127.0.0.1)上使用XAMPP for Windows 1.7.3提供的网页运行的PHP代码的"远程"调试工作.服务器的phpinfo()输出在笔记本电脑,其PDT 能够调试是与上述相同,除了:

xdebug.idekey       my_username     no value
xdebug.remote_host  localhost       localhost
xdebug.remote_log   no value        no value
Run Code Online (Sandbox Code Playgroud)

我很确定这些差异与问题无关.事实上,xdebug.idekey最初是Linux上的"root novalue",然后我通过编辑php.ini并在启动apache的sudo-ed脚本中设置环境变量DBGP_IDEKEY来更改为ECLIPSE_DBGP,徒劳地希望让事情正常工作.

笔记本电脑和Linux机箱之间有防火墙和NAT路由器.所以我试图通过PuTTY ssh隧道使用端口转发来使Linux XDEBUG与Windows PDT通信.我一直在使用XT转发PuTTY几个月没有任何问题.我在PuTTY中设置了隧道,本地端口9000转发到Linux机箱上的9000端口,Linux机箱上的端口9000转发到127.0.0.1上的端口9000,PuTTY隧道面板显示:

L9000  host...amazonaws.com:9000
R9000  127.0.0.1:9000
Run Code Online (Sandbox Code Playgroud)

在设置隧道时查看PuTTY事件日志,似乎没有问题:

2010-11-16 18:07:59 Local port 9000 forwarding to host...amazonaws.com:9000
2010-11-16 18:07:59 Requesting remote port 9000 forward to 127.0.0.1:9000
2010-11-16 18:07:59 Remote port forwarding from 9000 enabled
Run Code Online (Sandbox Code Playgroud)

但是当我转到PDT并在指定远程Web服务器的配置上单击Debug时,PDT会在右下角显示背景活动,卡在57%,如果我单击图标转到进度视图,则显示"启动:等待XDebug会话".

发生这种情况时,PuTTY事件日志显示:

2010-11-16 19:05:42 Received remote port 9000 open request from 127.0.0.1:54474
2010-11-16 19:05:42 Attempting to forward remote port to 127.0.0.1:9000
2010-11-16 19:05:42 Forwarded port opened successfully
2010-11-16 19:05:42 Opening forwarded connection to host...amazonaws.com:9000
2010-11-16 19:05:42 Forwarded connection refused by server: Connect failed [Connection refused]
2010-11-16 19:05:42 Forwarded port closed
Run Code Online (Sandbox Code Playgroud)

在Linux框中,/ var/log/secure只显示:

Nov 16 19:01:51 ip-10-194-9-67 sshd[14555]: error: connect_to host...amazonaws.com port 9000: failed.
Run Code Online (Sandbox Code Playgroud)

我已经检查了我的/ etc/ssh/sshd_config,我认为它没关系,甚至将它显式更改为"AllowTcpForwarding yes",即使这应该是默认值.在我的网络搜索解决方案中,我确实遇到了一个linuxquestions帖子,其中最后的回复说明了一些相当神秘的sshd需要解析主机名:

这似乎解决了这个问题:主机名一直是域名服务器,因为我一直认为我的路由器是domain.com ...所以在运行之后 hostname domain.com... bam!它最终有效......

我猜有时它太简单了.sshd必须将domain.com解析为我的路由器,因此连接失败.

我觉得这可能与我的问题有关,但这对我来说没有任何意义,因为它已经很老了,而且作者似乎也不理解它,我想我会问这里而不是那里......

我注意到大约一年前在这个论坛上提出了一个类似的问题,只得到了一个0值的反应,大概是因为问题是如此缺乏细节而无法回答.我希望这个人有足够的信息,而且时间不长,所以有人可以指引我.在阅读了常见问题解答以及如何提出问题之后,对我来说,正确使用论坛是否在原始的问题不完整但内容相同的问题上发布内容或发布这个新问题并不完全是显而易见的 - 我我相信有人会告诉我这是正确的选择:-)

我一直对这件事感到疯狂,我怀疑对于有经验的人来说这是非常明显的.虽然不是老式的C编程和用户级Linux和Windows设置,但我对这些东西(PHP,网络编程,网络管理员和本论坛)都是一个菜鸟.

soo*_*oot 3

多么尴尬啊,显然我的端口转发设置只有网络菜鸟才会做?我想我已经决定,由于在Web服务器上运行的Xdebug需要与笔记本电脑上的PDT调试器客户端通信,并且笔记本电脑上的PDT调试器客户端也需要与服务器上的Xdebug通信,并且只有一个端口号(9000),因此我需要将本地端口 9000 转发到远程端口 9000,并将远程端口 9000 转发到本地端口 9000;我混淆了流量方向与客户端发起与服务器端正在侦听的特定端口的(双向)连接的哪一侧。

似乎发生的情况是,笔记本电脑上运行的 PDT 调试器陷入等待 Linux 上运行的 Xdebug 建立连接的状态。因为我无法真正想到 Xdebug 需要侦听端口 9000 的情况,等待 PDT 调试器启动连接(而是等待 PDT 调试器通过已连接的连接向其发送命令)当它看到请求中的 XDEBUG_SESSION 参数时,它已经通过打开端口 9000 建立了),我决定摆脱本地端口 9000 到远程端口 9000 的转发。我这样做了,突然 PDT 收到了从 Linux 服务器发送的连接,调试从那里正常进行。

但我仍然不清楚为什么额外的转发实际上会引起问题。不同主机上的一对程序能否根据状态运行,有时一个是侦听器,有时另一个是侦听器?只要转发不会导致它们同时尝试侦听同一端口,我希望这没问题。

最重要的是,由于我所做的简化,现在事情似乎正在发挥作用,但我想了解为什么不必要的复杂性实际上导致了问题。我读了很多东西,包括O'Reilly 书中对 ssh 和隧道的精彩解释,但我仍然不明白。

  • 刚刚遇到了同样的问题 - 重要的是要记住您的 IDE 充当“服务器”,因为它在端口 9000 上等待来自 PHP Xdebug 进程的连接。因此您有一个转发远程服务器端口 9000 的隧道到您的 IDE 正在侦听的本地计算机的端口 9000。在 Mac 上,这是 ssh -R 9000:127.0.0.1:9000 yourname@yourserver.com (5认同)