使用 Docker、nginx、PHP7-FPM 和 Xdebug 进行 IDE 调试

Thi*_*ira 4 xdebug nginx docker-compose fpm php-7.2

我目前正在 macOS 上准备一个开发堆栈,docker-compose以便能够在PHP7-FPM(端口:9000)和nginx(端口:80)服务器上使用Xdebug(端口:9009)。

显然配置没问题,但我无法通过 IDE 进行调试。

这是我的设置:

我的.env文件:

APP_NAME=testeXdebug
HOST_SERVER_NAME=myapp
HOST_IP=docker.for.mac.localhost
# Use docker.for.mac.localhost - for OS X
# Use docker.for.win.localhost - for Windows
Run Code Online (Sandbox Code Playgroud)

DockerfilePHP7-FPM + Xdebug的:

FROM php:7.2-fpm

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml文件:

version: '3.5'

services:
  web:
    image: nginx:1.15.2
    ports:
      - '80:80'
    volumes:
      - '.:/usr/share/nginx/html'
      - './config/default.conf:/etc/nginx/conf.d/default.conf'
      - '/tmp/${APP_NAME}/web:/var/log/nginx'
    env_file:
      - '.env'
    depends_on:
      - 'php-fpm'
    links:
      - 'php-fpm'

  php-fpm:
    build: './docker'
    ports:
      - '9000:9000'
      - '9009:9009'
    expose:
      - 9000
      - 9009
    volumes:
      - '.:/usr/share/nginx/html'
      - './config/php-dev.ini:/usr/local/etc/php/conf.d/php-dev.ini'
      - '/tmp/${APP_NAME}/php-fpm:/var/log/xdebug'
    environment:
      XDEBUG_CONFIG: "remote_host=${HOST_IP}"
      PHP_IDE_CONFIG: "serverName=${HOST_SERVER_NAME}"
    env_file:
      - '.env'
Run Code Online (Sandbox Code Playgroud)

php-dev.ini文件:

; Xdebug
xdebug.default_enable = 1
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9009
xdebug.profiler_enable = 0
xdebug.idekey = PHPSTORM
xdebug.remote_handler = dbgp
xdebug.remote_mode = req
xdebug.remote_log = /var/log/xdebug/xdebug.log
Run Code Online (Sandbox Code Playgroud)

nginxdefault.conf文件:

server {
    listen          80;
    server_name     myapp;
    root            /usr/share/nginx/html;
    index           index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass    php-fpm:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后当通过浏览器访问服务器时,Xdebug 帮助程序扩展处于活动状态:

在此处输入图片说明

我得到这个调试日志(xdebug):

Log opened at 2018-08-11 19:22:53
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 192.168.128.1:9009.
I: Connected to client. :-)
-> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///usr/share/nginx/html/index.php" language="PHP" xdebug:language_version="7.2.8" protocol_version="1.0" appid="9" idekey="PHPSTORM"><engine version="2.6.1"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2018 by Derick Rethans]]></copyright></init>

-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response>

Log closed at 2018-08-11 19:22:53
Run Code Online (Sandbox Code Playgroud)

nginx访问日志:

192.168.128.1 - - [11/Aug/2018:18:57:25 +0000] "GET /favicon.ico HTTP/1.1" 200 94197 "http://docker.for.mac.localhost/index.php?XDEBUG_SESSION_START=PHPSTORM" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
192.168.128.1 - - [11/Aug/2018:19:22:53 +0000] "GET /index.php?XDEBUG_SESSION_START=PHPSTORM HTTP/1.1" 200 94341 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
192.168.128.1 - - [11/Aug/2018:19:22:53 +0000] "GET /favicon.ico HTTP/1.1" 200 94205 "http://docker.for.mac.localhost/index.php?XDEBUG_SESSION_START=PHPSTORM" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
192.168.128.1 - - [11/Aug/2018:19:30:12 +0000] "GET /_intellij_phpdebug_validator.php HTTP/1.1" 200 516 "-" "Java/1.8.0_152-release" "-"
Run Code Online (Sandbox Code Playgroud)

并使用以下调试扩展设置 VSCode:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9009,
            "pathMappings": {
                "/usr/share/nginx/html": "${workspaceRoot}"
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

添加一些断点:

在此处输入图片说明

PhpStorm 上

在此处输入图片说明

使用 docker-compose 的 PhpStorm CLI 解释器:

在此处输入图片说明

但是在开始侦听 PHP 调试连接时,我得到了Port 9009 is busy.

而且 IDE 从不启动调试工具... =(
我会错过什么?请帮帮我!


一些评论后:

php-fpm服务中删除portsexpose设置时docker-compose.yml

thiago@MA-TPR testeXdebug $ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                NAMES
735fc48fad63        nginx:1.15.2          "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp   testexdebug_web_1
b9b16af98fb5        testexdebug_php-fpm   "docker-php-entrypoi…"   4 minutes ago       Up 4 minutes        9000/tcp             testexdebug_php-fpm_1
thiago@MA-TPR testeXdebug $ 
Run Code Online (Sandbox Code Playgroud)

并从 xdebug 获取此日志:

Log opened at 2018-08-12 00:56:39
I: Checking remote connect back address.
I: Checking header 'HTTP_X_FORWARDED_FOR'.
I: Checking header 'REMOTE_ADDR'.
I: Remote address found, connecting to 192.168.160.1:9009.
W: Creating socket for '192.168.160.1:9009', poll success, but error: Operation now in progress (29).
E: Could not connect to client. :-(
Log closed at 2018-08-12 00:56:39
Run Code Online (Sandbox Code Playgroud)

nc从 PHP 容器执行:

root@b9b16af98fb5:/var/www/html# nc -zv docker.for.mac.localhost 9009
Warning: inverse host lookup failed for 192.168.65.2: Unknown host
docker.for.mac.localhost [192.168.65.2] 9009 (?) open
root@b9b16af98fb5:/var/www/html# 
Run Code Online (Sandbox Code Playgroud)

Laz*_*One 7

但是在开始侦听 PHP 调试连接时,我得到了 Port 9009 is busy

无需在 Docker 容器中公开 Xdebug 端口,根本不需要。

如果您公开它.. Docker 将侦听该端口并将任何连接转发到容器中。但它是 IDE/VSCode/PhpStorm 必须在监听它......因为它是连接到 IDE 而不是其他方式的 Xdebug

先解决这个问题。

xdebug.remote_connect_back = 1

我建议关闭它并在xdebug.remote_host( docker.for.mac.localhost) 中指定实际主机。

Xdebug 使用remote_connect_back选项检测到的 IP (取决于我猜的设置,以及 Docker 的工作方式)很可能不是主机的 IP。但这就是您所需要的——这是您的 IDE (PhpStorm)/编辑器 (VSCode) 运行且 Xdebug 必须连接到的地方。