【问题标题】:Separate Xdebug from php-fpm and nginx containers将 Xdebug 从 php-fpm 和 nginx 容器中分离出来
【发布时间】:2019-04-13 03:44:25
【问题描述】:

我想将我的所有开发工具与主要的 php-fpm 和 nginx 容器分开。所以我基本上有 3 个名为 php-fpm 的容器在端口 9000 上运行,nginx 在端口 80 和 dev-tools 上运行。我已经在我的开发工具容器上安装了 xdebug、composer 等,但我很困惑如何配置 xdebug 以便它可以与 php-fpm 容器一起使用并可以调试我的网站?第二个问题 xdebug 是否需要 php-cli 或 php-fpm 才能自行运行?

#dev-tools

FROM php:7.2-cli-alpine

# Install the PHP extensions we need
RUN set -ex \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin -- --filename=composer.phar \
    && apk add --no-cache git \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug

【问题讨论】:

  • 我相信 xdebug 必须在您的 php-fpm 容器中才能让您调试您的网络应用程序。

标签: php docker nginx xdebug devops


【解决方案1】:

xdebug 默认使用端口9000,与PHP-FPM 端口冲突。

您需要在 php.ini 中更改 PHP-FPM 池配置或 xdebug 的分配端口。我建议更新您的 PHP-FPM 配置以侦听不同的端口,因为使用 xdebug 进行调试的配置较少。

如果您想在 PHP-FPM 中更改端口。

/php-fpm.d/pool.conf

[pool]
listen = 127.0.0.1:9001

适当地更新您的 NGINX 配置以使用新端口。

否则,如果您想在 PHP 中更改 xdebug 端口。

php.ini

[xdebug]
xdebug.remote_port=9001

将您的调试(PHP 编辑器/IDE)软件和防火墙配置更新到新端口。或者使用 SSH 隧道将新的远程端口 9001 转发到默认的本地端口 9000


关于你的第二个问题

xdebug 仅作为 PHP (php-fpm) 的扩展运行,如果它设置为在您的 PHP ini 设置中加载。它不作为单独的后台服务运行。

例子:

[Browser Client -> http://example.com/path/to/script.php] 
   in -> [NGINX] 
        in -> [php-fpm /path/to/script.php] 
[xdebug remote host:port] <- out

[terminal command line] 
    in -> [php /path/to/script.php] 
[xdebug remote host:port] <-out

所以是的,xdebug 需要 php-fpm 或 php-cli 来运行,因为它们是一回事。

如果通过使用 php-fpm 的 Apache/NGINX,则需要将其加载到您的 fpm 配置中。如果通过 CLI 界面,则需要在 CLI 配置中加载。

请记住,您可以根据环境使用不同的 ini 配置运行 PHP。见PHP - The configuration file

【讨论】:

  • 作为容器run as isolated processes 如果您通过php-fpm 运行站点并希望使用xdebug 对其进行调试,则需要在您的#php-fpm 容器中进行配置。并且xdebug 扩展也需要可以从你的#php-fpm 容器中访问。根据我关于如何运行 xdebug 的示例php-fpm -&gt; xdebug。如果您在#dev-tools 容器中运行该站点,则同样适用。
  • xdebug 将其数据发送到指定的xdebug.remote_host,默认为localhost,它不会像php-fpm 或nginx 那样作为单独的服务冒泡或运行。它直接通过执行的 PHP 实例运行。我只解释了如何解决默认配置的端口冲突问题。我不知道您的 docker 网络配置,但在您使用的方法中,您可能希望使用 SSH 隧道,因此 xdebug.remote_host 将保留为默认值。
  • 您的调试客户端将是您的本地计算机,它正在运行一个期望接收远程 xdebug 数据的 IDE。您还可以在与 Web 服务器相同的子网中指定本地计算机 IP 地址。假设您的网络服务器是192.168.56.100,并且您的本地计算机设置为192.168.56.1,您将设置xdebug.remote_host = 192.168.56.1,但您需要设置防火墙规则以允许来自端口192.168.56.100 上的传入TCP/UDP 9001否则,您将使用 SSH 隧道捕获 remote localhost:9001 并将其转发到您的 local localhost:9000
  • php-fpm 是 PHP 作为 CGI 进程。 xdebug向 php-fpm 发送数据/对话,php-fpm 在启动时包含xdebug。这应该由docker-php-ext-enable xdebug 启用,它将extension=xdebug.so 添加到 php.ini.. xdebug 然后充当 php 中的额外层,因为 php 读取您的脚本。 xdebug 不是在后台运行的服务,它是由 php 运行的扩展。启用 xdebug 后,使用 CLI 中的 php -m 将列出 xdebug 否则运行具有&lt;?php phpinfo(); 的脚本应列出 xdebug 是包含的扩展。
  • @SkyRar 根据我的第一条评论,您必须使用 php-fpm 安装 xdebug,以便 php-fpm 可以将其作为扩展名包含在内。它不适用于 php-fpm 和 #dev-tools 容器中的 #php-fpm 容器。这就是为什么 @LazyOne 引用的文档将单个框显示为 [PHP/xdebug] 它们是一个且相同的。
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 2021-04-08
  • 2021-02-23
  • 2018-07-17
  • 2021-03-30
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多