将 Xdebug 与 php-fpm 和 nginx 容器分开

Sky*_*Rar 3 php xdebug nginx docker devops

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

#开发工具

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
Run Code Online (Sandbox Code Playgroud)

fyr*_*rye 5

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

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

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

/php-fpm.d/pool.conf

[pool]
listen = 127.0.0.1:9001
Run Code Online (Sandbox Code Playgroud)

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

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

php.ini

[xdebug]
xdebug.remote_port=9001
Run Code Online (Sandbox Code Playgroud)

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


至于你的第二个问题

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

例子:

[Browser Client -> http://example.com/path/to/script.php] 
   in -> [NGINX] 
        in -> [php-fpm /path/to/script.php] 
[xdebug remote host:port] <- out
Run Code Online (Sandbox Code Playgroud)

或者

[terminal command line] 
    in -> [php /path/to/script.php] 
[xdebug remote host:port] <-out
Run Code Online (Sandbox Code Playgroud)

所以是的,xdebug 需要 php-fpm 或 php-cli 才能运行,因为它们是同一个。

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

请记住,您可以根据环境使用不同的 ini 配置来运行 PHP。请参阅PHP - 配置文件

  • 由于容器“作为独立进程运行”,如果您通过“php-fpm”运行站点并希望使用“xdebug”对其进行调试,则需要在 #php-fpm 容器中进行配置。并且还需要从 #php-fpm 容器访问“xdebug”扩展。根据我关于如何运行 xdebug 的示例“php-fpm -&gt; xdebug”。如果您在 #dev-tools 容器中运行该站点,则同样适用。 (2认同)
  • `xdebug` 将其数据发送到指定的 `xdebug.remote_host`,默认情况下它是 `localhost`,它不会像 php-fpm 或 nginx 那样冒泡或作为单独的服务运行。它直接通过所执行的 PHP 实例运行。我只解释了如何解决默认配置的端口冲突问题。我不知道你的 docker 网络配置,但在你使用的方法中,你会想要使用 SSH 隧道,因此 `xdebug.remote_host` 将保留为默认值。 (2认同)
  • 您的调试客户端将是您的本地计算机,它正在运行期望接收远程“xdebug”数据的 IDE。您还可以指定与 Web 服务器位于同一子网上的本地计算机 IP 地址。假设您的网络服务器是“192.168.56.100”并且您的本地计算机设置为“192.168.56.1”,您将设置“xdebug.remote_host = 192.168.56.1”,但您需要设置防火墙规则以允许传入 TCP/UDP来自端口“9001”上的“192.168.56.100”否则,您将使用 SSH 隧道捕获“远程 localhost:9001”并将其转发到“本地 localhost:9000” (2认同)
  • @SkyRar 根据我的第一条评论,您必须使用 php-fpm 安装 xdebug,以便 php-fpm 可以将其作为扩展包含在内。php-fpm 和 #dev-tools 容器中的 #php-fpm 容器将无法使用它。这就是为什么 @LazyOne 引用的文档将单个框显示为“[PHP/xdebug]”,它们是同一个。 (2认同)