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

时间:2010-11-17 01:07:49

标签: 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

我使用PuTTY版本0.60中的SSH客户端从运行XP SP3的Windows笔记本电脑访问Linux机器。另外在笔记本电脑上我已经安装了Eclipse PDT(Helios Service Release 1 Build id:20100917-0705),我想我已经正确配置了使用端口9000进行XDEBUG远程调试。我说我认为< / em>,因为我很难弄清楚如何做到这一点,以及如何使用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

我很确定这些差异与问题无关。事实上,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

在设置隧道时查看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

但是当我转到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

在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.

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

  

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

     

我猜有时它太简单了。 sshd必须解析domain.com   到我的路由器,错误连接失败。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

似乎正在发生的事情是,笔记本电脑上运行的PDT调试器卡在等待Xdebug在Linux上运行以建立连接。因为我无法想到Xdebug需要监听端口9000的情况,等待PDT调试器启动连接(而不是等待PDT调试器通过具有连接的连接发送命令当它在请求中看到XDEBUG_SESSION参数时,已经通过它的开放端口9000建立了,我决定只是去掉本地端口9000到远程端口9000的转发。我这样做了,突然间PDT收到了从Linux服务器发送的连接,从那里正常进行调试。

但我脑子里还不清楚的是为什么有额外的转发实际上导致了问题。难道不能让不同主机上的一对程序运行,这取决于状态,有时一个是听众,有时候另一个是?只要转发不会导致它们同时尝试同时侦听同一个端口,我希望它没问题。

最重要的是,由于我所做的简化,事情似乎正在起作用,但我想了解为什么不必要的复杂性实际上导致了问题。我已经阅读了很多内容,包括the O'Reilly book中ssh和隧道的优秀解释,但我仍然没有得到它。