在远程服务器上使用Docker进行Xdebug远程调试

3
我需要在远程服务器上的Docker容器中调试PHP脚本。
通常情况下,我会使用Windows中的Visual Studio Code来调试我的代码。我一直以来都是用这种方式来调试我的开发代码(位于Vagrant中),没有遇到过任何问题。
但是当我要调试远程服务器上的Docker中的文件时,我就无法使其正常工作。
以下是我的xdebug设置,位于php.ini文件中(在远程服务器的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无法检测到调试会话。

基本上我所做的是这些:

  1. 在我的本地机器(Windows)上启动调试会话
  2. 使用ssh -R 9000:localhost:9000 username@myremoteserver.com创建到远程服务器的ssh隧道(将服务器上的端口9000转发到localhost:9000)
  3. 将Docker上的9000端口映射到远程服务器上的9000端口
  4. 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中设置的连接“转发”到我的远程服务器,再到我本地pc上的IDE?


不要使用标准的9000端口,最好选择9001或其他端口。目前,一些了解Xdebug是什么以及如何工作的服务正在响应Xdebug连接(根据您的日志),并简单地告诉Xdebug“离开”(通过说“在结束之前运行而不进行调试”)。如果您使用错误的IP地址,它很可能是php-fpm。此外,我不知道172.18.0.1来自哪里--对于SSH隧道,您应该真正使用127.0.0.1 - LazyOne
  1. "在docker中,Xdebug被设置为监听其主机" 什么?请查看文档。Xdebug并不会监听任何东西。因为是Xdebug连接到IDE,而不是反过来...
  2. IP地址必须是您的IDE/编辑器运行的PC的地址(如果您喜欢并且可以直接连接)。否则,您需要使用SSH隧道...然后您需要使用127.0.0.1,这样连接就会从远程系统转发到您的开发PC。
- LazyOne
  1. 现在你必须只是连接到本地(或远程)的php-fpm或类似的服务,该服务知道Xdebug的工作方式,因为它明确告诉Xdebug“离开”。
- LazyOne
  1. RTM: https://xdebug.org/docs/remote
  2. 这是为PhpStorm准备的...但也适用于VSCode(因为基础是任何IDE/编辑器都相同):https://confluence.jetbrains.com/display/PhpStorm/Remote+debugging+in+PhpStorm+via+SSH+tunnel
- LazyOne
可能是 https://stackoverflow.com/questions/53496300/xdebug-php-7-1-phpstorm-remote-server-with-docker-how/ 的重复问题。 - likemusic
1个回答

2
我通过ssh隧道无法做到同样的事情 :(
但是可以通过ngrok实现。你需要:
  1. 在本地开发机上安装ngrok
  2. 运行ngrok tcp 9000
  3. 根据ngrok的信息设置xdebug.remote_portxdebug.remote_host

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接