远程服务器上 Docker 内的 Xdebug 远程调试

Posted

技术标签:

【中文标题】远程服务器上 Docker 内的 Xdebug 远程调试【英文标题】:Xdebug Remote Debugging inside Docker on remote server 【发布时间】:2018-10-19 03:14:25 【问题描述】:

我需要调试位于远程服务器上 Docker 容器内的 php 脚本。

通常,我在 Windows 中使用 Visual Studio Code 调试我的代码。我一直在以这种方式调试我的开发代码(位于 Vagrant 中),没有任何问题。

但是当涉及到在远程服务器上的 Docker 中调试文件时,我无法让它工作。

这是我在 php.ini 上的 xdebug 设置(在位于远程服务器上的 docker 中)

xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host=172.18.0.1
xdebug.remote_port=9000
xdebug.remote_log=/tmp/debug.log

上面设置中的remote_host IP 地址是从 Docker 内部看到的远程主机的 IP。

我已经尝试通过 ssh 隧道连接到我的远程服务器(从 Windows,使用 telnet)。

但是当我尝试在浏览器上运行该站点时,我的 Visual Studio Code 无法检测到调试会话。

基本上我做的是这些:

    在我的本地计算机 (Windows) 上启动调试会话 使用ssh -R 9000:localhost:9000 username@myremoteserver.com创建到远程服务器的ssh-tunnel(将服务器上的端口9000转发到localhost:9000) 将 Docker 上的 9000 端口映射到远程服务器上的 9000 端口 docker 中的 Xdebug 设置为侦听其主机(因此从 docker 内部看到的主机 IP 地址,我从 docker 内部运行此命令得到:/sbin/ip route|awk '/default/ print $3 '

当我运行该站点时,/tmp/debug.log 包含以下内容:

I: Connecting to configured address/port: 172.18.0.1:9000.
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///magento/test.php" language="PHP" xdebug:language_version="5.6.33-1+ubuntu16.04.1+deb.sury.org+1" protocol_version="1.0" appid="12776" idekey="www-data"><engine version="2.5.5"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2017 by Derick Rethans]]></copyright></init>

-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response>

如何将 Xdebug 设置的连接从 Docker“中继”到我的远程服务器,再到我本地电脑上的 IDE?

【问题讨论】:

不要使用标准的 9000 端口——最好选择 9001 或其他端口。现在,一些知道 Xdebug 是什么以及它是如何工作的服务正在响应 Xdebug 连接(根据您的日志),并简单地告诉 Xdebug“离开”(通过说“在没有调试的情况下运行直到结束”)。如果您使用了错误的 IP 地址,它很可能是 php-fpm。另外,不知道172.18.0.1 是从哪里来的——对于SSH 隧道,你真的应该使用127.0.0.1 1) “docker 中的 Xdebug 设置为监听它的主机” 什么?请RTM。 Xdebug 什么都不听。仅仅是因为它是 Xdebug 连接到 IDE 而不是其他方式... 2) IP 地址必须是运行 IDE/编辑器的 PC 的地址(如果您愿意并且可以直接连接)。否则你需要 SSH 隧道...然后你需要使用 127.0.0.1 以便连接从远程系统转发到你的开发 PC。 3) 现在你必须只连接到本地(远程)php-fpm 或一些 Xdebug 感知的类似服务(知道它是如何工作的)......因为它清楚地告诉 Xdebug “走开”。 1) RTM: xdebug.org/docs/remote 2) 它适用于 PhpStorm .. 但也适用于 VSCode(因为任何 IDE/编辑器的基础都是相同的):confluence.jetbrains.com/display/PhpStorm/… ***.com/questions/53496300/…的可能重复 【参考方案1】:

我没有成功通过 ssh-tunnel 做同样的事情:(

但ngrok 是可能的。你应该:

    在本地开发机器上安装ngrok; 运行ngrok tcp 9000; 根据ngrok的信息设置xdebug.remote_portxdebug.remote_host

【讨论】:

以上是关于远程服务器上 Docker 内的 Xdebug 远程调试的主要内容,如果未能解决你的问题,请参考以下文章

在 docker 内的远程机器上使用 PyCharm 的远程调试器

从 Docker 容器内部使用 XDebug 进行远程调试不起作用

远程服务器的 Xdebug 未连接

使用 XDebug 进行 PHP 远程调试

使用 PHPStorm 解决 PHPUnit xdebug 远程调试问题

Phpstorm + xdebug:尽管服务器主机可能不是本地主机,但远程主机配置为“localhost”