【问题标题】:Xdebug in docker container fails to connect to PhpStorm on Qubes OSdocker 容器中的 Xdebug 无法连接到 Qubes OS 上的 PhpStorm
【发布时间】:2020-02-26 17:18:11
【问题描述】:

Docker 容器中的 Xdebug 无法连接到我系统上的 PhpStorm。

我正在尝试使用 PhpStorm 为 Linux (qubes-os / Fedora 30) 上的 Docker 环境设置 Xdebug。 Xdebug 已启用,我可以访问错误消息。在 PhpStorm 中,我总是使用我给 Xdebug 作为远程主机的相应 IP 更新 DBGp 代理设置。我尝试了许多版本的 Xdebug 设置,但都失败了。

我目前的最佳猜测是内部 IP 管理出现问题。这可能是因为qubes-os,但我不太相信,因为它是普通的 Fedora,而且我以前从未遇到过这样的问题......

我的 Xdebug 配置

zend_extension=xdebug.so

[Xdebug]
xdebug.idekey=PHPSTORM
xdebug.remote_enable=true
xdebug.remote_port=5902
xdebug.remote_host=host.docker.internal
xdebug.remote_log=/tmp/xdebug-remote.log

(我知道host.docker.internal 不适用于 Linux。 我仍然在使用它,以便通过在 docker 的 /etc/hosts 文件中为该变量设置 IP 来进行调试容器)

我的phpinfo()

xdebug support  enabled
Version 2.6.1
IDE Key PHPSTORM
xdebug.remote_enable    On  On
xdebug.remote_handler   dbgp    dbgp
xdebug.remote_host  host.docker.internal    host.docker.internal
xdebug.remote_log   /tmp/xdebug-remote.log  /tmp/xdebug-remote.log
xdebug.remote_mode  req req
xdebug.remote_port  5902    5902
xdebug.remote_timeout   200 200

我的 web-log 告诉我,我的请求来自 172.18.0.1 - - [31/Oct/2019:09:58:22 +0000] "GET / HTTP/1.1" 200 47698 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"

我的ifconfig输出主机

br-8d5002ad7a3a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:17ff:feaa:e865  prefixlen 64  scopeid 0x20<link>
        ether 02:42:17:aa:e8:65  txqueuelen 0  (Ethernet)
        RX packets 5  bytes 513 (513.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 866 (866.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:99ff:fe38:e669  prefixlen 64  scopeid 0x20<link>
        ether 02:42:99:38:e6:69  txqueuelen 0  (Ethernet)
        RX packets 4055  bytes 233615 (228.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4367  bytes 55073512 (52.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.137.0.17  netmask 255.255.255.255  broadcast 10.255.255.255
        inet6 fe80::216:3eff:fe5e:6c00  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:5e:6c:00  txqueuelen 1000  (Ethernet)
        RX packets 555370  bytes 785064402 (748.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 208464  bytes 13235820 (12.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 107  bytes 227427 (222.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 107  bytes 227427 (222.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth0271483: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::183d:fdff:fe2b:f8ce  prefixlen 64  scopeid 0x20<link>
        ether 1a:3d:fd:2b:f8:ce  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1379 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth25193ce: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::603c:beff:fe87:6283  prefixlen 64  scopeid 0x20<link>
        ether 62:3c:be:87:62:83  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1379 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vetha36c6d7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::789d:60ff:fe15:8eb4  prefixlen 64  scopeid 0x20<link>
        ether 7a:9d:60:15:8e:b4  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1379 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethc039300: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::a0a9:4eff:fe3d:8338  prefixlen 64  scopeid 0x20<link>
        ether a2:a9:4e:3d:83:38  txqueuelen 0  (Ethernet)
        RX packets 5  bytes 513 (513.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 866 (866.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethe777af4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::c07e:11ff:fe1a:9f6b  prefixlen 64  scopeid 0x20<link>
        ether c2:7e:11:1a:9f:6b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1379 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我的 ifconfig 输出在 docker 容器上

eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:05  
          inet addr:172.18.0.5  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1260 (1.2 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

我的 netstat -ltn 来自我的主机

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:10137           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6942          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:5902            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:63342         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:20080           0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 :::9000                 :::*                    LISTEN     
tcp6       0      0 :::3306                 :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 :::81                   :::*                    LISTEN     
tcp6       0      0 :::8082                 :::*                    LISTEN    

我的 netstat -ltn 来自 docker 容器

Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 127.0.0.11:34183        0.0.0.0:*               LISTEN      
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9001            0.0.0.0:*               LISTEN    

当使用xdebug.remote_connect_back=1 我得到

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:5902.
E: Time-out connecting to client (Waited: 200 ms). :-(
Log closed at 2019-10-31 09:32:55

当我在 docker 容器中运行 netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}' 时,我得到 172.18.0.1

因此我会得出结论xdebug.remote_host = 172.18.0.1

但是当我使用 docker 添加的 IP 到容器的/etc/hosts 时(IP 更改为 172.17-18.0.1-4,现在是 172.18.0.4)并查看我得到的 Xdebug 日志

W: Creating socket for 'host.docker.internal:5902', poll success, but error: Operation in progress (29).
E: Could not connect to client. :-(

因此,由于这些 IP 有点不确定,我只是尝试了我在途中遇到的每个 IP,作为 docker 容器的 xdebug.remot_host。而我来自 xdebug 的上述失败日志之一

另外还有telnetping的结果:

telnet 172.18.0.1 5902:
telnet: can't connect to remote host (172.18.0.1): Operation timed out
bash-4.4# telnet 172.18.0.4
telnet: can't connect to remote host (172.18.0.4): Connection refused

bash-4.4# ping 172.18.0.1:
5 packets transmitted, 0 packets received, 100% packet loss

bash-4.4# ping 172.18.0.4
PING 172.18.0.4 (172.18.0.4): 56 data bytes
5 packets transmitted, 5 packets received, 0% packet loss

结论:我迷路了。我基本上尝试了所有可能的 IP 地址。请帮助我了解我需要做什么才能调试我的 PHP 代码。谢谢!

【问题讨论】:

  • 1) host.docker.internal 根本无法在 Linux 上运行(仅限 Mac 和 Windows)——(编辑你已经知道了,抱歉,没有马上注意到)2) "我的netstat -ltn 来自我的主机”——我认为是 PhpStorm 监听 0.0.0.0:5902 ? 3) “在 Phpstorm 中,我总是更新 DBGp 代理设置” 本地开发根本不需要 DBGp 代理——请在尝试使用之前先阅读它的作用。
  • 1) 使用格式来解决这个问题 2) 可能 - 我怎么知道? 3) 公平点,我跟其他人一样。
  • “可能 - 我怎么知道?” 尝试使用 netstat 的 -b 和/或 -o 选项(虽然我在 Windows 上,但在另一个操作系统上它可以不同:-b 显示所涉及的可执行文件;-o 显示与每个连接关联的拥有进程 ID)。对于 Mac,我猜它会在 sudo lsof -nP -iTCP -sTCP:LISTEN 输出中。
  • 遗憾的是,我没有任何具体的解决方案/建议给您——您似乎知道自己在做什么……但由于某种原因它不起作用。对于 IP 检测 - 检查 this thread 以及可能带有 xdebug + docker tags 的其他线程。
  • 确保 PhpStorm 是监听 Xdebug 端口的那个。尝试本地连接以确保它可以接受连接。您甚至可以从 IDE 端启用额外的日志记录(以查看它是否接收到连接) -- intellij-support.jetbrains.com/hc/en-us/articles/… 如果一切都好 -- 它看起来像一些网络/防火墙问题......也许是一些 SELinux 或类似的?

标签: linux docker phpstorm xdebug qubes-os


【解决方案1】:

TLDR:在您的 docker 容器中指定 xdebug.remote_connect_back=0xdebug.remote_host=172.17.0.1,它应该可以工作。请记住:Xdebug 需要从您的网络服务器(在 Docker 内部)连接到您的 IDE,并在端口 9000 上侦听。

你没有显示 Docker 的 ifconfig,所以我可能把上面的 IP 地址弄错了。但是,重要的是您在 xdebug.remote_host 中指定的 IP 地址是您的 IDE 监听的地址。并且该 IP 地址需要可从 Docker 访问。您可以通过在 Docker 容器中运行“telnet IpAddress 9000”来测试它,以查看您是否获得了正确的主机 IP 地址。

但还有其他几点:

在您的 docker 容器上,您的 netstat 显示:

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9001            0.0.0.0:*               LISTEN 

那里有运行 DBGp 代理吗?你不应该这样做。代理只会让您的情况变得更复杂。

我在您主机的 netstat 中看到:

tcp6       0      0 :::9000                 :::*                    LISTEN     

您是否使用仅侦听 IPv6 的 IDE?您可能想看看是否可以将其更改为使用 IPv4 运行。

【讨论】:

  • 在我的问题中添加了 docker 的 ifconfig。我正在使用template,其中端口 9000/9001 用于附加 php 容器。在此设置中,xdebug 侦听端口 5902
  • 所以我在 docker 容器中的 ifconfig 告诉我 172.18.0.5 似乎是 IP。 telnet 172.18.0.5 9001(这是 php 机器连接到主机的地方)给了我一个 connection closed by foreign host telnet 172.18.0.5 5902(我的 xdebug 远程端口)导致 telnet: can't connect to remote host (172.18.0.5): Connection refused
【解决方案2】:

如果您在本地机器上并且有一个 docker 容器,那么设置 xdebug.remote_host=host.docker.internal 并将 host.docker.internal 添加到 /etc/hosts 就足够了。

我在入口 sh 脚本中这样做:netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2" host.docker.internal"}' &gt;&gt; /etc/hosts

如何检查数据是否发送:

  1. 您可以启用xdebug.remote_log=/var/log/xdebug_remote_log.log
  2. 我更喜欢监听主机nc -l 5902nc -l 0.0.0.0 5902 上的端口。通过 telnet 从 docker telnet host.docker.internal 5902 发送文本并输入一些内容。您应该在主机上的nc 中看到它

如果您的 docker 在远程主机上,那么您必须允许 ssh GatewayPorts yes 监听 0.0.0.0:5904 或将流量转发到 127.0.0.0:5905。看here

  1. 在远程主机上运行一次:socat TCP-LISTEN:5904,fork TCP:127.0.0.1:5905
  2. 在本地机器上获得响应运行:ssh -R 5905:localhost:5904

您可以检查与nctelnet 的连接。

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 2016-10-01
    • 1970-01-01
    • 2022-01-10
    • 2021-06-24
    • 2017-09-21
    • 2015-08-03
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多