Как сделать удаленную отладку по xdebug через NAT?

xintrea

Новичок
Что-то не могу заставить работать удаленную отладку.

Использую: PHP 5.6, xdebug 2.2.5, NetBeans 8.1.

PHP работает через Nginx в режиме FPM.

В каталоге /etc/php5/mods-available есть файл xdebug.ini. Его содержимое:

zend_extension=xdebug.so​

В других таких же файлах расширений тоже указаны so-шники без пути, и все расширения работают.

В файле /etc/php5/fpm/php.ini прописано:

[xdebug]
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=тут_IP_моего_NAT
xdebug.remote_autostart=0
xdebug.idekey="netbeans-xdebug"​

В phpinfo видно следующее:

xdebug support enabled
Version 2.2.5
IDE Key netbeans-xdebug​

То есть, xdebug вроде как работает.

Я создал проект в NetBeans с удаленными исходниками. Исходники выкачались, с этим все нормально.

Пытаюсь отладиться. Ставлю точку останова на вторую-третью команду в index.php. В качестве браузера настроен встроенный браузер WebKit. Открывается URL вида:


но остановки не происходит. Страница полностью рендерится, а внизу NetBeans пишется:

Ожидание подключения (netbeans-xdebug)​

Вопрос в следующем: похоже, что xdebug работает как клиент отладки, а не как сервер отладки. То есть, не NetBeans подключается к порту xdebug, а xdebug должен подключаться к отладочному порту NetBeans. И если так, тогда неясно, как xdebug подключится к моему NetBeans за двумя NAT-ами. Как это можно организовать?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Непонятно что такое "IP_моего_NAT". Если речь о том, что php работает в виртуалке, в которой сеть типа NAT - было бы понятней, иначе надо уточнять.
Еще непонятно откуда взялось два NAT-а.

Как это можно организовать - зависит от ответа на первый вопрос. В случае виртуалок - пробросом портов или поднятием host-only сети.
 

xintrea

Новичок
Непонятно что такое "IP_моего_NAT". Если речь о том, что php работает в виртуалке, в которой сеть типа NAT - было бы понятней, иначе надо уточнять.
Еще непонятно откуда взялось два NAT-а.

Как это можно организовать - зависит от ответа на первый вопрос. В случае виртуалок - пробросом портов или поднятием host-only сети.
Первый NAT провайдера, второй NAT домашней сетки. IP_моего_NAT - это по сути то, что показывает http://www.yoip.ru для домашней станции.

Выяснилось, что действительно xdebug не работает как сервер, а инициализирует коннект как клиент. Поэтому в общем случае при удаленной отладке интернет-хоста нужно что-то шаманить, чтобы этот интернет-хост смог достучаться из интернета до домашней рабочей станции.

Решил через SSH туннель. На рабочей станции дается команда подключения к отлаживаемому хосту:

ssh -R 9000:127.0.0.1:9000 myhosh.ru​

На хосте в натройках xdebug указывается локальный IP (не забыть перезапустить nginx/fpm):

xdebug.remote_host=127.0.0.1​

И получается что на отлаживаемом хосте xdebug стучится на локальный 9000-й порт, пакет по туннелю пробрасывается на 9000-й порт рабочей станции, и уже с него происходит подключение к отладчику рабочей станции.
 
Сверху