LINUX.ORG.RU

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

 , ,


0

1

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

Использую: 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 вида:
http://mysite.ru/index.php?XDEBUG_SESSION_START=netbeans-xdebug

но остановки не происходит. Страница полностью рендерится, а внизу NetBeans пишется:
Ожидание подключения (netbeans-xdebug)

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

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Ответ на: комментарий от xSudo

Я же написал: «В качестве браузера настроен встроенный браузер WebKit.»

Это встроенный в NetBeans браузер.

Xintrea ★★★★★
() автор топика

Курить настройки XDEBUG
А NAT в чем проблема? Кормишь XDEBUG-у айпи ближайшего к нему NAT-а, делов то.

FeyFre ★★★★
()
Ответ на: комментарий от Xintrea

Кстати, одно время, что бы как раз таки NetBeans работал c xdebug на сервере пробрасывал через ssh порты и настраивал как для локальной работы.

xSudo ★★★
()
Ответ на: комментарий от FeyFre

А NAT в чем проблема? Кормишь XDEBUG-у айпи ближайшего к нему NAT-а, делов то.

Я так понял, что сессию инициирует xdebug, который находится на удаленном сервере, и пытается прицепиться к IP-шнику, прописанному в xdebug.remote_host. А NetBeans у меня за двумя Nat-ами.

Я же написал, что скормил в xdebug строку:

xdebug.remote_host=тут_IP_моего_NAT

Этот IP взял с http://www.yoip.ru

Но debug-соединение не устанавливается.

Вот и думаю, то ли это я неправильно понимаю, и сессию создает NetBeans, толи создатели xdebug знатные извращенцы.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от FeyFre

Таким, что если скрипт из браузера запускается, то XDEBUG_SESSION_START нужно слать. Я просто не до конца прочиал пост)

xSudo ★★★
()
Ответ на: комментарий от Xintrea

Похоже что сессию всё-таки должен создавать сервер, а нетбинс ждет коннект.
Локальный фаерволл не дропает входящие коннекты? А на сервере?
Если нет, то скорее всего проблема в NAT. Почему NAT не редиректит порты - хз, нужно проверять там настройки. Скорее всего кто-то посчитал что эта функция не нужна, или «не безопасна». Последнее лечится только отсечением думающего органа(и далеко не всегда это голова). Если у вас действительно оба NAT(а не PAT) то нужно обращаться к их хозяевах пусть включат. В любом случае выяснить где пакеты дропаются. Если хозяева упираются либо PAT, то гуглить на тему проброса портов(страшные слова типа upnp, мне на практике не приходилось таким страдать).
Если всё туго, то как посоветовал товарищ выше, ssh тунели вам в помощь. Я последние 2 месяца так и отлаживаюсь, перебросив порты через 2 вложенных тунеля(причем в обе стороны: отладчик через тунели туда коннектится, сервер оттуда сюда обращается к отдельно запущенным симуляторам).

FeyFre ★★★★
()
Ответ на: комментарий от Xintrea

Если коротко, то man ssh (если оффтопик, вы не уточняли и пользуетесь putty то F1 в ssh/tunnel окне).
Готовая команда будет типа такой:

ssh user@<host-сервера> -R 9000:localhost:9000

Вводим пароль и радуемся.
Что делает -R - пробросить туннель из сервера на клиент: на сервере будет слушается порт 9000(первое 9000 перед ":") и в случает входящих соединений, сам ssh у вас на клиенте попытается сунутся по указанному адресу (localhost:9000 , а можно сунутся куда-нибудь в другое место). Опцию можно повторять сколько угодно раз
Дальше в настройках XDEBUG настроить хост отладчика localhost ну и порт который первый 9000. И сервер и клиент при этом думают что общаются с локальным(для них) встречным узлом по TCP.
Главное теперь ssh-коннект не оборвать. И да, оно естественно будет медленнее чем прямое соединение - шифрование и всё-такое.
гуглить man ssh - Опеннет первая ссылка описание на русском

FeyFre ★★★★
()
Ответ на: комментарий от FeyFre

Благодарю, все получилось через SSH туннель.

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.