Отладка IDE с помощью Docker, nginx, PHP7-FPM и Xdebug

В настоящее время я готовлю стек разработки для macOS с docker-compose, чтобы иметь возможность использовать Xdebug (порт: 9009) на PHP7-FPM (порт: 9000) и nginx (порт: 80).

Судя по всему, конфигурация в порядке, но я не могу выполнить отладку через 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

Dockerfile PHP7-FPM + Xdebug:

FROM php:7.2-fpm

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

Файл 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'

Файл 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

Файл nginx default.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;
    }
}

Затем при доступе к серверу через браузер с активным расширением Xdebug helper:

введите здесь описание изображения

Я получаю этот журнал отладки (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

Журнал доступа 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" "-"

И настройте VSCode с расширением отладки следующим образом:

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

Добавьте несколько точек останова:

введите здесь описание изображения

И на PhpStorm:

введите здесь описание изображения

Интерпретатор PhpStorm CLI, использующий docker-compose:

введите здесь описание изображения

Но при Начать прослушивание отладочного соединения PHP я получаю Port 9009 is busy.

И IDE никогда не запускает инструмент отладки... =(
Что я мог упустить? Пожалуйста, помогите мне!


После некоторых комментариев:

При удалении ports и expose настроек службы php-fpm из 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 $ 

И получите этот журнал от 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

Выполнение 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# 

person Thiago Pereira    schedule 11.08.2018    source источник
comment
Заставить XDEBUG работать — это все равно, что пытаться заставить 10 тарелок вращаться на палочках одновременно. Одна из проблем может заключаться в том, что PhpStorm не может видеть ваш файл PHP.ini, как он сообщает. Вы настроили PHP в разделе Languages ​​& Frameworks? evernote.com/l/AAVXKjxUZRNB8L-XhXCJg3j3s63jZpJLw2g Docker, чтобы иметь возможность XDEBUG и заниматься локальной разработкой, или пользователи заинтересованы в работе с Docker по другим причинам? IOW, а как насчет других альтернатив, которые уже работают с XDEBUG?   -  person MikeSchinkel    schedule 11.08.2018
comment
@MikeSchinkel Я добавил изображение с информацией о переводчике.   -  person Thiago Pereira    schedule 12.08.2018
comment
Но при запуске прослушивания отладочного соединения PHP я получаю Port 9009 is busy Конечно, оно занято -- вы его используете. Вы выставили 9009 в Docker? Почему? Зачем? Если вы выставите его .. Docker прослушивает этот порт и перенаправляет любые соединения в контейнер. Но... это IDE/VSCode/PhpStorm должны его слушать... потому что это Xdebug подключается к IDE, а НЕ наоборот (пожалуйста, RTFM). Так что сначала исправьте это и попробуйте еще раз.   -  person LazyOne    schedule 12.08.2018
comment
@LazyOne Спасибо. Поэтому я обновил вопрос с вашими предложениями   -  person Thiago Pereira    schedule 12.08.2018
comment
1) Какое приложение слушает 9009? Используйте sudo lsof -nP -iTCP -sTCP:LISTEN на Mac и netstat на Windows. 2) xdebug.remote_connect_back = 1 -- лучше отключить и указать хост в remote_host -- попробуйте так. IP-адрес, к которому Xdebug или nc пытается подключиться, каждый раз разный — насколько мне известно, так быть не должно.   -  person LazyOne    schedule 12.08.2018
comment
@LazyOne работает, отключите обратное подключение. Спасибо!   -  person Thiago Pereira    schedule 12.08.2018


Ответы (2)


Но при запуске прослушивания отладочного соединения PHP я получаю Port 9009 is busy

Нет необходимости открывать порт Xdebug в вашем контейнере Docker, вообще нет необходимости.

Если вы выставите его. Docker будет тем, кто прослушивает этот порт и перенаправляет любые соединения в контейнер. Но именно IDE/VSCode/PhpStorm должны его слушать... потому что это Xdebug подключается к IDE, а НЕ наоборот.

Исправьте это в первую очередь.

xdebug.remote_connect_back = 1

Я рекомендую отключить это и указать фактический хост в xdebug.remote_host (docker.for.mac.localhost).

IP-адрес, обнаруженный Xdebug с параметром remote_connect_back (я думаю, зависит от настроек и от того, как работает Docker), скорее всего, не будет IP-адресом хост-компьютера. Но это то, что вам нужно — это место, где работает ваша среда разработки (PhpStorm)/редактор (VSCode), и к которому должен подключаться Xdebug.

person LazyOne    schedule 12.08.2018
comment
теперь есть общая настройка для Mac, Windows и Linux, я думаю, «host.docker.internal», но без вашей второй части ответа это не сработало, и это не было особо подчеркнуто, поэтому я потерял его при чтении, но xdebug.remote_connect_back=0 конкретно тоже очень важно!!! Я только что прочитал ваши настройки, а не текст вокруг, поэтому я подумал, что он должен быть установлен на 1, но он должен быть равен нулю. С уважением, разные парни, играющие с сопоставлениями портов, и разоблачение, как вы правильно сказали, бесполезно, поскольку xdebug внутри php использует случайный скрытый порт, конкретный порт 9000 является удаленным. В противном случае спасибо за помощь. - person FantomX1; 12.02.2020
comment
поэтому xdebug.remote_connect_back = 0 также необходим в Windows, хотя в linux у меня был опыт, что его не нужно отключать. - person FantomX1; 12.02.2020

Если вы используете «Docker для Mac», то в конфигурационном файле xdebug вы также можете использовать это:

xdebug.remote_host = host.docker.internal

Я ХОЧУ ПОДКЛЮЧИТЬСЯ ИЗ КОНТЕЙНЕРА К СЛУЖБЕ НА ХОТЕ
У хоста меняется IP-адрес (или отсутствует, если у вас нет доступа к сети). Начиная с 18.03 мы рекомендуем подключаться к специальному DNS-имени host.docker.internal, которое разрешается во внутренний IP-адрес, используемый хостом. Это предназначено для целей разработки и не будет работать в производственной среде за пределами Docker для Mac.

Шлюз также доступен как gateway.docker.internal.

person hserge    schedule 07.10.2018