如何在nginx反向代理后面使用XDebug和PHP上游?

时间:2017-01-01 23:34:00

标签: php nginx docker xdebug

我有一个通过PHP-FPM运行的PHP服务器,它通过端口7000上的nginx与fastcgi一起提供。此应用程序已停靠,并作为正在运行的容器运行,例如的 my_api

my_api docker容器可以通过端口7000直接连接(用于完整性检查)以及另一个充当nginx反向代理的容器,该代理使用上游来公开{{1端口my_api80上的应用程序(和其他人)(端口443重定向到SSL)通过适当位置下的80指令。

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

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

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

就本问题而言,以下是我的9000配置和docker-compose.yml的(相关)示例:

搬运工-compose.yml

xdebug.ini

xdebug.ini

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

NB:我尝试了几种不同的配置来尝试使其工作,包括启动运行dbgpproxy的Docker容器,但似乎没有任何东西允许我调试请求通过反向代理。虽然我用于这些尝试的配置是错误的,但是很有可能。

我对我的问题有一些理论,其中包括怀疑反向代理的IP地址是通过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 配置属性传递给XDebug的。

如何正确配置XDebug以处理通过nginx代理向服务器发出的请求传递给上游服务器的任何帮助或见解将不胜感激!

如果它有用,我可以提供进一步的细节!

2 个答案:

答案 0 :(得分:2)

以下是我如何让PHP Storm连接到dockerized 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中设置一个调试服务器,或者您使用的任何指向http://127.0.0.1:8080的IDE(或者您将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 :(得分:0)

在Windows上,我还需要禁用选项remote_connect_back(在Linux上则不需要)

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