Отладка удаленного xdebug за NAT

// Июль 20th, 2017 // PHP, Веб-разработка

debugВ этом посте я расскажу, как настроить xdebug и PhpStorm для отладки удалённого сервера за NAT. Возможно, такая задача встанет у вас, когда рабочая версия вашего проекта будет лежать на удалённой машине (вне вашей подсети), а phpStorm — установлен локально.

Проблема

Итак, ситуация такая: имеется рабочая станция, получающая доступ к интернету через роутер с NAT. Мы делаем HTTP запрос из браузера, открывается сессия xdebug и он делаем backconnect на порт dbgp рабочей станции.  Все это прекрасно работает, когда у сервера и рабочей станции статические адреса и они находятся в одной подсети.

dbgp-setup

Однако, когда наш сервер находится в другой подсети за NAT — начинаются проблемы. Проблема состоит в том, что когда мы открывает браузером страницу на виртуалке, то веб-сервер (и xdebug) получают из запроса внешний ip адрес нашей рабочей станции (т.е. IP адрес роутера) и бекконнект идёт туда. А роутер вообще не в курсе, что мы что-то там отлаживаем.

Решение

Мы сделаем ход конем и пробросим порт xdebug через ssh туннель на рабочую станцию. Таким образом xdebug и phpstorm будут думать, что идёт локальная отладка. Условимся, что у нас php-fpm сидит на порту 9000, а xdebug будет работать на порту 9001.

phpstorm-debug

Устанавливаем xdebug например так:

sudo apt-get install php5.6-xdebug

Вот мой конфиг из /etc/php/5.6/fpm/conf.d/@20-xdebug.ini

zend_extension=xdebug.so
xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9001
xdebug.idekey="PHPSTORM"
# xdebug.remote_connect_back=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req

Очень важно, чтобы у вас не была выключена директива xdebug.remote_connect_back, т.к. она сбрасывает значения xdebug.remote_host/port и бекконнект идёт по тому IP, от которого пришел HTTP-запрос (т.е. на роутер), а нам надо, чтобы бекконнект шел на наш туннель.

Теперь создадим ssh туннель. В linux это делается так:

ssh -R 9001:localhost:9001 username@dev.example.com

В Windows вот так:

putty_xdebug_tunnel

Соединяемся и проверяем, что туннель работает:

telnet 127.0.0.1 9001

Теперь можно настраивать phpStorm.

Прописываем порт в разделе Debug.

php_debug

Настраиваеми PHP Remote Interpetor. У вас на этом шаге уже должен быть настроен Deployment server, т.е. мы берем его в качестве remote php interpretor.

php_remote_interpretator

Настраиваем PHP Remote debugger на локальный конец нашего туннеля.

php_remote_debug

Настраиваем DBGp proxy

dbgp_proxy

Включаем клиента (listener) xdebug в phpStorm.

start-listen

Теперь идём в браузер, ставим там какое-то расширение или букмарклет, который будет передавать параметр запроса для xdebug. Можно использовать Firefox + theeasiestxdebug.

Затем открываем страничку нашего сайта. После этого в phpStorm должно вылезти примерно такое окно оповещение о входящем коннекте.

incoming-connection

Нажимаем Accept и можем спокойно работать с удаленной отладкой.

Ссылки

Setup Xdebug for remote debug over SSH

PuTTY xdebug SSH tunnel

Remote Debugging PHP with a Firewall in the Way

Remote debugging in PhpStorm via SSH tunnel

https://xdebug.org/docs/all_settings#remote_connect_back

Share

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


Комментировать