Mac Docker 上带有 SSH 隧道的 Xdebug
Xdebug with SSH tunnel on Docker for Mac
我最近在 Docker 社区阅读了很多关于如何使用 Docker 为 [=17] 在 PHPStorm 中调试 PHP 应用程序的帖子=].它们都包含一些有用的信息,但还没有在一个地方看到有效的解决方案。
这对我有用。
内部 Docker 容器
编辑 xdebug 配置
# automatically start debugger on every request
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port=9000
# send all debug requests to 127.0.0.1, remote_connect_back should be turned off
xdebug.remote_connect_back = 0
xdebug.remote_host=127.0.0.1
#log all xdebug requests to see is it working correctly
xdebug.remote_log=/var/log/remote.log
验证 xdebug 是否有效
此时尝试运行PHP申请。日志应包含每个请求的此类条目:
I: Connecting to configured address/port: 127.0.0.1:9000
I: Connected to client. :-)
如果您在日志中看到类似这样的内容,则表明 remote_host 或 remote_connect_back 配置不正确。
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 172.18.0.1:9000.
W: Creating socket for '172.18.0.1:9000', poll: Operation now in progress.
E: Could not connect to client. :-(
我见过 Xdebug 在 CLI 中工作但在浏览器中不工作的情况,当这个问题出现在日志中时,remote_connect_back=0 修复了它。
sshd 配置
为了允许到容器的 ssh 隧道:编辑 /etc/ssh/sshd_conf 并添加:
GatewayPorts yes
如果需要重新启动 sshd(理想情况下这应该是 Docker 文件的一部分)。
在主机上
启动反向 SSH 隧道
运行 此命令并将其保存在单独的终端选项卡中打开:
ssh -p {container_22_port} -R 9000:localhost:1111 root@127.0.0.1
其中 {container_22_port} 是主机上映射到 docker 容器上暴露的 22 端口的端口。 9000 是容器内 Xdebug 使用的端口,主机将使用 1111 端口来侦听 Xdebug 连接。
用 netcat 测试
此时您可以验证 Xdebug 是否确实将信息从 docker 容器内部传递到主机。启动netcat查看1111端口发送了什么和运行phpapplication:
nc -l 1111
你应该看到这样的东西:
<?xml version="1.0" encoding="iso-8859-1"?>
<init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///var/www/magento2/index.php" language="PHP" xdebug:language_version="7.0.12" protocol_version="1.0" appid="1006" idekey="XDEBUG_ECLIPSE"><engine version="2.5.0rc1"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2016 by Derick Rethans]]></copyright></init>
配置 PhpStorm
Opne File
->DefaultSettings
,然后在 Languages&Frameworks
->PHP
->Debug
中更改 Xdebug
->Debug port
到 1111
(我们用来打开 ssh 隧道的那个)。
此时 PhpStorm 应该开始接受来自 xdebug 的连接。
这种方法有什么问题吗?
我发现您不需要 SSH 隧道即可运行。
Xdebug 只需要连接到 运行 IDE 调试器,但可能已经使用了一些默认端口,例如用于 FPM (9000) 的端口。
容器内
将 xdebug 选项设置为:
xdebug.remote_enable = 1
xdebug.remote_host = localhost
xdebug.remote_port = 10000
xdebug.remote_connect_back = 1
注意:如果使用 nginx-proxy 容器作为反向代理,请将您的 remote_host
设置为您在 VIRTUAL_HOST
使用 PhpStorm
- 文件 -> 设置
- 语言和框架
- PHP
- 服务器:添加一个并将主机设置为 localhost: 80 并使用 Xdebug 选择 路径映射 ...映射文件夹 INSIDE Docker (/var/www/) 到一个
- 调试:将 Xdebug 端口 设置为 10000,并勾选 可以接受外部连接
使用 xdebug.remote_host=host.docker.internal
无处不在。
我最近在 Docker 社区阅读了很多关于如何使用 Docker 为 [=17] 在 PHPStorm 中调试 PHP 应用程序的帖子=].它们都包含一些有用的信息,但还没有在一个地方看到有效的解决方案。
这对我有用。
内部 Docker 容器
编辑 xdebug 配置
# automatically start debugger on every request
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port=9000
# send all debug requests to 127.0.0.1, remote_connect_back should be turned off
xdebug.remote_connect_back = 0
xdebug.remote_host=127.0.0.1
#log all xdebug requests to see is it working correctly
xdebug.remote_log=/var/log/remote.log
验证 xdebug 是否有效
此时尝试运行PHP申请。日志应包含每个请求的此类条目:
I: Connecting to configured address/port: 127.0.0.1:9000
I: Connected to client. :-)
如果您在日志中看到类似这样的内容,则表明 remote_host 或 remote_connect_back 配置不正确。
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 172.18.0.1:9000.
W: Creating socket for '172.18.0.1:9000', poll: Operation now in progress.
E: Could not connect to client. :-(
我见过 Xdebug 在 CLI 中工作但在浏览器中不工作的情况,当这个问题出现在日志中时,remote_connect_back=0 修复了它。
sshd 配置
为了允许到容器的 ssh 隧道:编辑 /etc/ssh/sshd_conf 并添加:
GatewayPorts yes
如果需要重新启动 sshd(理想情况下这应该是 Docker 文件的一部分)。
在主机上
启动反向 SSH 隧道
运行 此命令并将其保存在单独的终端选项卡中打开:
ssh -p {container_22_port} -R 9000:localhost:1111 root@127.0.0.1
其中 {container_22_port} 是主机上映射到 docker 容器上暴露的 22 端口的端口。 9000 是容器内 Xdebug 使用的端口,主机将使用 1111 端口来侦听 Xdebug 连接。
用 netcat 测试
此时您可以验证 Xdebug 是否确实将信息从 docker 容器内部传递到主机。启动netcat查看1111端口发送了什么和运行phpapplication:
nc -l 1111
你应该看到这样的东西:
<?xml version="1.0" encoding="iso-8859-1"?>
<init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///var/www/magento2/index.php" language="PHP" xdebug:language_version="7.0.12" protocol_version="1.0" appid="1006" idekey="XDEBUG_ECLIPSE"><engine version="2.5.0rc1"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2016 by Derick Rethans]]></copyright></init>
配置 PhpStorm
Opne File
->DefaultSettings
,然后在 Languages&Frameworks
->PHP
->Debug
中更改 Xdebug
->Debug port
到 1111
(我们用来打开 ssh 隧道的那个)。
此时 PhpStorm 应该开始接受来自 xdebug 的连接。
这种方法有什么问题吗?
我发现您不需要 SSH 隧道即可运行。
Xdebug 只需要连接到 运行 IDE 调试器,但可能已经使用了一些默认端口,例如用于 FPM (9000) 的端口。
容器内
将 xdebug 选项设置为:
xdebug.remote_enable = 1
xdebug.remote_host = localhost
xdebug.remote_port = 10000
xdebug.remote_connect_back = 1
注意:如果使用 nginx-proxy 容器作为反向代理,请将您的 remote_host
设置为您在 VIRTUAL_HOST
使用 PhpStorm
- 文件 -> 设置
- 语言和框架
- PHP
- 服务器:添加一个并将主机设置为 localhost: 80 并使用 Xdebug 选择 路径映射 ...映射文件夹 INSIDE Docker (/var/www/) 到一个
- 调试:将 Xdebug 端口 设置为 10000,并勾选 可以接受外部连接
- PHP
- 语言和框架
使用 xdebug.remote_host=host.docker.internal
无处不在。