Я пишу сайты на Django. Обычно разработка ведётся на локальной машине, а не на сервере :) И иногда приходится отлаживать коллбэки каких-то сервисов, например, IPN у PayPal. Проблема в том, что локальная машина недоступна из интернета и коллбэк просто не дойдёт до пункта назначения. Для решения этой проблемы есть несколько решений.
Удалённая отладка
Одно из решений - удалённая отладка. В этом случае код будет выполняться на удалённой машине. Это не очень удобный способ. Но кроме отладки коллбэков, в некоторых случаях просто бывает удобно отлаживать процесс, запущенный на удалённой машине - на сервере, например, при этом делать это из привычной среды разработки и иметь все возможности локальной отладки - пошаговое выполнение, просмотр переменных, стэка и т.д. Настроить удалённую отладку на Pydev несложно.
Всё что нужно уже идёт вместе с Pydev, а на их сайте есть хорошая инструкция как настроить удалённую отладку. Схема такая:
На локальной машине (там где запущен Eclipse/Aptana с Pydev) запускаем remote debugger server с помощью кнопочки
start the pydev server. У меня эта кнопочка находится в перспективеDebug:После запуска сервера во вкладке
Debugпоявится запущенный сервер, а во вкладкуConsoleдобавится строчка что сервер запущен.На удалённой машине нужно вставить в код, который нужно отладить, такую строчку:
import pydevd;pydevd.settrace();Эта строчка импортирует модуль, который идёт вместе с
Pydev, а вызовsettrace()остановит выполнение скрипта, предоставляя нам возможность удалённой отладки. Модульpydevd, вместе с содержимым папки<eclipse path>\plugins\org.python.pydev.debug_x.x.x.xxxxxxxxxx\pysrc, нужно разместить там, где Python сможет найти эти файлы (в папках из переменной окруженияPATH, или добавить туда свою папку);Пока мы имеем никак не связанные две машины - локальную и удалённую. Что бы они смогли обмениваться данными, настроим ssh туннелинг.
pydevdна удалённой машине по умолчанию будет слать данные (после вызоваsettrace()) в порт5678(соответственно, remote debugger server слушает тот же порт). Добавим новый порт в настройках PuTTY:
Всё готово. Я настраивал удалённую отладку для работы с Django приложением, поэтому проверим её на такои примере - надо отладить код вьюхи index, которая выполняется, когда пользователь заходит на корень сайта.
Добавляю строчку:
def index(request): import pydevd;pydevd.settrace() a = 1 + 2 b = a * 2 ... return direct_to_template(request, ...)Перезапускаю сервер, выполняющий Django приложение (Apache):
service httpd restartЗахожу браузером в корень сайта - выполнение кода останавливается, а Aptana на локальной машине позволяет отлаживать код.
Вот хорошее описание как работает settrace():
After passing through the
pydevd.settrace()it should stop in any breakpoints you have defined. You can even callpydevd.settrace(suspend=False)if you don't want it to stop at the settrace call, only on defined breakpoints. There is a catch though, by default it'll only trace the current thread, if you want it to trace other threads in this call, you have to callsettrace(trace_only_current_thread=False).
Т.е. лучше поместить вызов settrace() куда-нибудь в django.wsgi в код запуска приложения.
С удалённой отладкой есть такая проблема. Скрипт выполняется на сервере, соответственно файлы нужно модифицировать на сервере. Кроме того нужно перезапускать сервер, выполняющий эти скрипты, либо как-то автоматизировать перезапуск. Это существенные минусы, хотя и можно немного улучшить ситуацию, например, настроить в эклипсе соединение с сервером и загружать локальные файлы на сервер прямо из эклипса, или править файлы на сервере (тоже из эклипса).
В общем, удалённая отладка очень неудобна, и имеет смысл её применять в очень особых случаях.
Перенаправление портов
Другой подход заключается в том, что бы как-то сделать доступным локальную машину из интернета. Этот вариант гораздо удобнее удалённой отладки, ведь отладка будет происходить польностью на локальной машине.
Один из вариантов - настроить форвардинг портов ssh. Внешний сервис будет посылать коллбэк нашему серверу на специальный порт, а этот порт с помощью ssh будет перенаправляться на локальную машину с запущенным под отладчиком приложением.
Для начала нужно разрешить демону sshd принимать запросы с удалённых адресов (по-умолчанию он принимает запросы только с
localhost). Правим файл/etc/ssh/sshd_config, раскомментируем/добавляем строчкуGatewayPorts yes:mcedit /etc/ssh/sshd_configПерезапустим
sshd:service sshd restartЗатем настраиваем PuTTY что бы перенаправлял порт удалённой машины (пусть будет
5679) на порт локальной машины (у меня django devserver работает на9999):Запускаем PuTTY, запускаем django dev server под отладчиком, и заходим браузером по адресу
http://<server.domain>:5679/и пользуемся нормальной отладкой с бряками и прочим.
Оба способа требуют хорошего подключения к серверу. У меня PuTTY часто терял подключение и даже вылетал. Не очень приятно, но думаю для отладки пары коллбэков хватит :)
PS. Есть ещё как минимум один вариант - для Opera Unite есть приложение Web Proxy, которое делает почти тоже самое что и перенаправление портов, только сервер будет оперовский и без PuTTY.