如何在nginx反向代理后的PHP upstream中使用XDebug?

13

我有一个PHP服务器,通过PHP-FPM运行,并通过nginx在端口7000上以fastcgi方式提供服务。此应用程序已经被docker化,并作为运行中的容器运行,例如my_api

my_api docker容器可以直接通过端口7000进行连接(用于检查),也可以通过另一个容器进行连接,该容器作为nginx反向代理,使用upstreams在适当位置的proxy_pass指令下公开my_api应用程序(和其他应用程序)的端口80443(端口 80 重定向到SSL)。

如果我使用dbgp在端口9000上直接针对从http://localhost:7000提供的文件启动XDebug会话,我可以看到正确建立调试会话并进行调试。

但是,如果我尝试针对nginx反向代理提供的URL启动XDebug会话,例如https://localhost/my-api,则调试会话似乎没有启动,或者至少它没有正确创建连接(我的IDE中没有触发断点等)。

如何为通过nginx反向代理发出的请求建立XDebug会话?

为了回答这个问题,下面是我docker-compose.yml配置和xdebug.ini的(相关)样例:

docker-compose.yml:

version: "2"

services:
  api:
    build: <path_to_dockerfile>
    ports:
       - 7000:7000
       #- 9000:9000   # may be uncommented for direct debugging access
  nginx_proxy:
    build: <path_to_dockerfile>
    links:
      ...
      - api:api
    ports:
      - 80:80
      - 443:443

xdebug.ini

zend_extension=xdebug.so
xdebug.remote_enable=true
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_autostart=0

NB:我尝试了几种不同的配置来使它工作,包括启动运行dbgpproxy的Docker容器,但是似乎没有什么可以让我调试通过反向代理传递的请求。然而,这些尝试所使用的配置很可能是错误的。

我有一些关于我的问题可能是什么的理论,其中怀疑通过remote_connect_back配置属性将反向代理的IP地址传递给XDebug。

非常感谢任何帮助或洞察力,以正确配置XDebug使其能够与通过nginx代理传递到上游服务器的请求一起工作!

如果需要,我可以提供更多细节!


2
xdebug.remote_connect_back=1 -- make it = 0 and use proper host/IP in xdebug.remote_host - LazyOne
1
另外,启用xdebug日志并查看它会说什么 - 它将显示尝试连接的IP:端口和(如果接受调试会话)正在发生的情况。 - LazyOne
3个回答

3
以下是翻译的结果:

以下是我如何使PHP Storm连接到一个基于docker的php-fpm / nginx应用程序的方法:

将远程主机IP注入容器中。在您的主机上,设置变量:

XDEBUG_HOST=$(ipconfig getifaddr en0)

我不太熟悉docker-compose。我正在使用Kubernetes清单,但我相信有一种方法可以注入环境变量。

在xdebug.ini中:

xdebug.remote_host=${XDEBUG_HOST}

现在,您应该可以设置xdebug客户端以侦听调试连接的xdebug.remote_port。您还需要在PHP Storm或您正在使用的任何IDE中设置一个指向http://127.0.0.1:8080(或您将nginx容器端口转发到的任何端口)的调试服务器。
我的设置如下所示。我使用PHP Storm,但我相信您可以适应其他xdebug客户端。 PHP Storm Xdebug server settings PHP Storm preferences xdebug.ini:
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_port=10000
xdebug.remote_autostart=1
xdebug.idekey=www-data
xdebug.remote_host=${XDEBUG_HOST}

参考链接:https://shippingdocker.com/xdebug/


1

因为我在 Windows 上工作,所以我还需要禁用 remote_connect_back 选项(尽管在 Linux 上不需要)。

xdebug.remote_connect_back = 0
xdebug.remote_host = host.docker.internal

1
是的,这很重要,因为remote_connect_back会隐式地覆盖/忽略remote_host设置,并尝试解析应用程序上运行Web请求的机器的IP。这通常很有帮助,但在使用Kubernetes时,IP可能是意外的(来自网络内部而不是实际本地主机IP)。 - Kamafeather

0

虽然回答有点晚,但我一直在努力实现这个 xdebug 的想法,即在 NGINX 反向代理 后面的网站上使用 xdebug。然而,我得出结论,除非暴露网站的端口,在您的情况下为 7000,否则无法实现。我在 IntelliJ PHPStorm 上尝试过。

原因:

xdebug 尝试使用 Path Mapping 将文件 _intellij_phpdebug_validator.php 上传到 web 容器以验证 URL。例如,它尝试将文件上传到 var/www/web,但是由于这是唯一可使用特定 URL http://web.local/web 访问的容器,因此在 proxy 容器上找不到此文件夹。当它尝试通过 URL http://localhost/web/_intellij_phpdebug_validator.php 访问此文件时,内部代理传递调用尝试访问文件 /var/www/web/_intellij_phpdebug_validator.php,当它找不到该文件时,返回错误 404 not found

在另一种情况下,当我使用xdebug暴露我的端口8110并访问URL http://web.local:8110时,它会找到正确的路径映射,即/var/www/web,并且xdebug开始正常工作。 NGINX代理容器错误日志记录条目(试图在/etc/nginx/html寻找文件,即nginx代理的路径,而最初尝试将文件上传到/var/www/web根据配置)。
2021/10/27 10:50:37 [error] 34#34: *25 open() "/etc/nginx/html/_intellij_phpdebug_validator.php" failed (2: No such file or directory), client: 172.23.0.1, server: proxy, request: "GET /_intellij_phpdebug_validator.php HTTP/1.1", host: "127.0.0.11"

网站容器错误日志条目(尝试在/var/www/web查找文件,即网站路径,但它从未上传到此处,因此导致404错误)

172.23.0.2 - - [27/Oct/2021:10:51:01 +0000] "GET /web/_intellij_phpdebug_validator.php HTTP/1.0" 404 16 "-" "Java/11.0.6" "172.23.0.1"

Graphical Representation of Path Mapping conflict

Error 404

After exposing the PORT


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