Удаленная отладка через XDebug и PhpStorm (via ssh tunneling)

Категория: Linux

Многие программисты скорее всего уже наступали на эти грабли, проходили дальше, а грабли так и оставались... Если вам необходимо настроить удаленную отладку через SSH тунель, очень надеюсь что данный пост сэкономит Вам несколько часов времени, а после этого вы всегда сможете подсказать молодым специалистам куда пойти чтобы настроить XDebug через SSH-туннель)

Создание SSH-туннеля

Нам нужно пробросить порт с удаленного сервера на локальный комп. Удаленный XDebug отправляет в этот порт отладочную информацию, а наш PhpStorm будет слушать этот порт на локалке. Сначала определимся с номером порта, для этого посмотрим какие из 900x портов свободны. Вы вправе выбрать любой свободный порт, но поскольку XDebug по умолчанию использует port = 9000 - будет правильно выбрать порт из близкого диапазона.

Посмотреть список открытых (занятых) портов на сервере и локалке (на всякий):

netstat -tnlp | grep 900

Примерный вывод команды netstat с сервера:

Proto   Local Address    Foreign Address   State   PID/Program name
tcp     127.0.0.1:9002      0.0.0.0:*      LISTEN      24658/ssh
tcp6          ::1:9002           :::*      LISTEN      24658/ssh

Смотрим какие из портов заняты и выбираем свободный. Допустим, это порт 9003.

Ok, создаем туннель - пробросим этот порт с сервера на локалку (выполнять на локалке):

ssh -R 9003:localhost:9003 user@server

user и server - это имя пользователя и удаленного сервера, соответственно.

После выполнения этой команды обратите внимание на вывод в консоли. Удаленный сервер может вывести следующие ошибки:

bind: Cannot assign requested address
# используйте 127.0.0.1 вместо localhost
bind: Address already in use
# порт уже используется, выберите другой

Также стоит проверить доступность соединения через telnet:

telnet 127.0.0.1 9003

Возможные ответы при подключении:

Connection closed by foreign host.                   # значит все хорошо
Unable to connect to remote host: Connection refused # ошибка подключения

Чтобы прервать telnet подключение нажмите Ctrl+] потом Enter и Ctrl+D.

Проверим, что туннель успешно создан и порт открыт (на локалке):

Proto   Local Address    Foreign Address    State   PID/Program name
tcp      0.0.0.0:9003       0.0.0.0:*      LISTEN      4861/java
Внимание!

В некоторых случаях, для проключения SSH-туннеля рекомендуют отключить IPv6 протокол. Боюсь не силен объяснить почему, но это помогло. После отключения IPv6, при создании туннеля может понадобится явно указывать что нужно использовать IPv4 протокол (параметр -4):

ssh -4 -R 9003:localhost:9003 user@server

Теперь укажите порт 9003 в .htaccess и можно переходить к настройке PhpStorm:

php_value xdebug.remote_enable 1
php_value xdebug.remote_port 9003

Настройка PhpStorm

Для настройки PhpStorm необходимо указать проброшенный порт для отладки, запустить "слушатель" этого порта и создать конфигурацию отладки. Тут все довольно просто..

Для включения слушателя выполните: Run » Start Listen for PHP Debug Connections. Также на панели инструментов есть одноименная кнопка (на скриншоте она выключена):

Порт XDebug указывается в настройках проекта: File » Setting » PHP » Debug, поле Debug Port.Также поставьте отметку - Can accept external connections.


Внимание!

При запуске слушателя порта в PhpStorm вы можете получить ошибку: Port 9036 is busy.


Это означает, что указанный порт занят другим приложением - воспользуйтесь netstat или выберите другой порт.

Теперь осталось создать нужную конфигурацию и запустить сессию отладки XDebug. Можете ознакомиться с информацией «Настройка локальной отладки XDebug и PhpStorm 7.1»

категория: Linux