Отладка удаленного xdebug за NAT
В этом посте я расскажу, как настроить xdebug и PhpStorm для отладки удалённого сервера за NAT. Возможно, такая задача встанет у вас, когда рабочая версия вашего проекта будет лежать на удалённой машине (вне вашей подсети), а phpStorm – установлен локально.
Проблема
Итак, ситуация такая: имеется рабочая станция, получающая доступ к интернету через роутер с NAT. Мы делаем HTTP запрос из браузера, открывается сессия xdebug и он делаем backconnect на порт dbgp рабочей станции. Все это прекрасно работает, когда у сервера и рабочей станции статические адреса и они находятся в одной подсети.
Однако, когда наш сервер находится в другой подсети за NAT – начинаются проблемы. Проблема состоит в том, что когда мы открывает браузером страницу на виртуалке, то веб-сервер (и xdebug) получают из запроса внешний ip адрес нашей рабочей станции (т.е. IP адрес роутера) и бекконнект идёт туда. А роутер вообще не в курсе, что мы что-то там отлаживаем.
Решение
Мы сделаем ход конем и пробросим порт xdebug через ssh туннель на рабочую станцию. Таким образом xdebug и phpstorm будут думать, что идёт локальная отладка. Условимся, что у нас php-fpm сидит на порту 9000, а xdebug будет работать на порту 9001.
Устанавливаем xdebug например так:
1 |
sudo apt-get install php5.6-xdebug |
Вот мой конфиг из /etc/php/5.6/fpm/conf.d/@20-xdebug.ini
1 2 3 4 5 6 7 8 9 |
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 это делается так:
1 |
ssh -R 9001:localhost:9001 username@dev.example.com |
В Windows вот так:
Соединяемся и проверяем, что туннель работает:
1 |
telnet 127.0.0.1 9001 |
Теперь можно настраивать phpStorm.
Прописываем порт в разделе Debug.
Настраиваеми PHP Remote Interpetor. У вас на этом шаге уже должен быть настроен Deployment server, т.е. мы берем его в качестве remote php interpretor.
Настраиваем PHP Remote debugger на локальный конец нашего туннеля.
Настраиваем DBGp proxy
Включаем клиента (listener) xdebug в phpStorm.
Теперь идём в браузер, ставим там какое-то расширение или букмарклет, который будет передавать параметр запроса для xdebug. Можно использовать Firefox + theeasiestxdebug.
Затем открываем страничку нашего сайта. После этого в phpStorm должно вылезти примерно такое окно оповещение о входящем коннекте.
Нажимаем Accept и можем спокойно работать с удаленной отладкой.
Ссылки
Setup Xdebug for remote debug over SSH
Remote Debugging PHP with a Firewall in the Way
Расскажите, более подробно для Windows 10
Что именно вас интересует?