Возможна ситуация, когда вам нужно отладить сложный случай на удаленной машине, но доступ к серверу возможен только по VPN с ограничениями на открытые порты.
В этой статье я хочу поделиться с коллегами небольшим «исследованием» на тему удаленной отладки по SSH под VPN, чтобы сэкономить драгоценное время на настройке.
Считаю миссию выполненной, если эта мана кому-то пригодится.
Спойлер Сервер был развернут на Ubuntu, поэтому далее все настройки сервера будут под Ubuntu. На локальной машине — Mac, но здесь нам нужен только SSH-клиент и IDE с отладчиком для xdebug, поэтому настройки относительно универсальны.
Вводный
Итак, за защищенной цепью находится удаленный сервер.
На сервере в Docker устанавливается микросервис с включенным xdebug. Внешний доступ есть только через SSH и VPN.
Цель
Цель: запустить удаленную отладку микросервиса локально через xdebug. Идти…1. Настройте sshd на удаленном сервере.
Первое, на что следует обратить внимание, это то, что на сервере необходимо настроить sshd так, чтобы он позволял принимать соединения с любого IP, а не только с 127.0.0.1. По умолчанию эта опция отключена.
Вот здесь и нужен root. Будем считать, что он у вас есть :-)
sudo echo "GatewayPorts yes" >> /etc/ssh/sshd_config sudo service ssh restart
2. Узнайте адрес хост-машины в сети докера.
Поскольку xdebug запускается в докере и подключается к локальному компьютеру.
(и в моем случае этот IP не разрешается, поскольку соединение происходит по VPN), полезно узнать IP хост-машины в сети докера.
Это можно сделать с помощью команды (выполняется на сервере): ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+'
Допустим, команда выводит «172.17.0.1».
3. Прописать IP удаленного хоста в настройках xdebug в контейнере.
Пример замены через sed, но можно и вручную в редакторе, как вам удобнее: sed -i 's/xdebug.remote_host=.
*/xdebug.remote_host=172.17.0.1/' /usr/local/etc/php/conf.d/xdebug.ini
Не отходя от кассы, прописываем «правильный» порт для отладки.
В моем случае микросервис построен на комбинации nginx и php-fpm и обычно порт 9000 занят php-fpm , и поэтому для отладки я использую порт 9001. sed -i 's/xdebug.remote_port=.
*/xdebug.remote_port=9001/' /usr/local/etc/php/conf.d/xdebug.ini
Здесь стоит проверить, что удаленная отладка в принципе включена: «xdebug.remote_enable=1» grep xdebug.remote_enable /usr/local/etc/php/conf.d/xdebug.ini
Обычно эти настройки встроены в Dockerfile или монтируются через том.
На сервере все готово.
Теперь нас перебрасывают на локальную машину для строительства туннеля.
4. Перенаправить SSH-туннель на удаленный сервер.
Туннель поднимается командой (выполняется на локальной машине): SSH -R 9001:0.0.0.0:9001 user@remote_server
В этом месте звучит волшебная музыка.
Базовая настройка завершена, теперь остается только среда отладки.
настройка IDE
Обычно я использую vscode, поэтому отладчик без проблем работает через прослушивание портов.
Вот пример конфигурации для vscode (просто добавьте узел в launch.json): {
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9001,
"cwd": "${workspaceFolder}",
"pathMappings": {
"/repo": "${workspaceRoot}"
}
},
«pathMappings» — правило сопоставления каталогов локальных и удаленных машин, где «/repo» — каталог с отлаживаемым кодом в Docker. Необходимо, чтобы отладчик имел возможность перемещаться по файлам и точкам останова.
P.S. Ну что, попробуем?
Запускаем netcat на локальной машине и слушаем: nc -l 9001
Запускаем однострочный скрипт в Docker и печатаем:
php -r 'print("Hi!" .
PHP_EOL);'
На локальной машине мы должны увидеть позывные xdebug:
<Эxml version="1.0" encoding="iso-8859-1"?>
<init xmlns=" urn:debugger_protocol_v1 " xmlns:xdebug="https://xdebug.org/dbgp/xdebug ".
Ура! Все готово.
Теперь вы можете отлаживать любимый код на удаленной машине в IDE. У описанного метода есть очевидный недостаток: перенастройка sshd на сервере.
Возможно, есть более тихий способ.
В любом случае буду рад вашим комментариям и советам.
Спасибо за внимание! Теги: #Разработка сайтов #vpn #php #xdebug #отладка #ssh #vscode
-
Отдам Кармаграф В Хорошие Руки
19 Oct, 24 -
Как Они Работают И Зачем Нам Нужны Датагриды
19 Oct, 24 -
Лица Спама 2
19 Oct, 24 -
Баг, Фича Или Скрытая Реклама?
19 Oct, 24