Доброго времени суток.
Упорно не могу подружить xdebug на удаленном сервере (freebsd) с neatbeans на локальной машине (windows). Прошу подсказать, что и где еще можно подкрутить?
Итак, что имеем:
На сервере:
Хостинг от Ru-Center, FreeBSD/Apache/Nginx, PHP 5.6, установил xdebug,
PHP.INI (в части xDebug):
[debug]
zend_extension="/home/USERNAME/usr/php/lib/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=localhost
xdebug.remote_port=9009
;xdebug.remote_connect_back=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.idekey="netbeans-xdebug"
xdebug.remote_log="/home/USERNAME/logs/xdebug/xdebug.log"
xdebug.profiler_output_dir="/home/USERNAME/logs/xdebug/profiler/"
xdebug.trace_output_dir="/home/USERNAME/logs/xdebug/trace/"
вместо USERNAME - везде корректная папка юзера, естественно;
автостарт - да, это временно, пока работоспособности хдебага не добьюсь...
phpinfo сообщает, что xdebug успешно работает, вся конфигурация отображается так же, как задано в php.ini.
Локально - WinXP, NetBeans, файрволл отключен (и штатный и комодо).
Сложность в том, что IP-адрес
НЕ выделенный, поэтому на удаленке явно задать xdebug.remote_host не вариант... поэтому с помощью PUTTY проброшен обратный SSH-туннель:
R9009 - localhost:9009
Удаленный 9009 порт - пробрасывается на локальный 9009, вроде все стандартно;
Удаленный netstat -a|grep 9009 показывает, что туннель есть:
tcp6 0 0 localhost.9009 *.* LISTEN
Если тыкаюсь в сайт - xdebug начинает что-то отправлять на localhost:9009 :
tcp4 0 0 nosorog.nichost..14107 localhost.9009 SYN_SENT
tcp6 0 0 localhost.9009 *.* LISTEN
НО! до локальной машины ни коннект ни данные по тунелю не доходят.
Теперь странности:
И все бы ничего, можно было грешить на много чего - на файрволл, на провайдера, на закрытые порты у хостера (хотя за открытие портов на вход и выход я дополнительно заплатил), если бы ни одно НО:
Для проверки работоспособности туннеля локально запускаю простой листенер:
from socket import *
from time import sleep
host = ''
port = 9009
sock = socket(AF_INET, SOCK_STREAM)
print 'sock.bind...'
sock.bind((host, port))
sock.listen(5)
while 1:
print ' sock.accept - listening for incoming connection...'
conn, addr = sock.accept()
print ' connected from '+str(addr)
sleeptime = 10
print ' sleep for ' + str(sleeptime) + ' sec before force close connection...'
sleep(sleeptime)
print ' conn.close...'
conn.close()
print ' disconnected from '+str(addr)
print 'sock.close...'
sock.close()
Удаленно запускаю
ssh -p 9009 localhost
И выясняется, что коннект-то есть (листенер на локальной машине принимает входящее соединение от сервера, нетстаты на обоих машинах видят успешное соединение, в общем - идиллия).
Но вот почему-то никто больше (кроме этой команды) на сервере может через него достучаться до локальной машины. И никто больше (кроме этого листенера) на локальной машине - не замечает сигналов от сервера через этот туннель.
ИТОГО, были испробованы все возможные варианты на сервере и локально:
С сервера:
- ssh -p 9009 localhost
- тестовым скриптом наподобие листенера выше
- собственно, xdebug (т.к. autostart, то любой запрос к сайту инициирует отправку данных на localhost:9009)
На локальной машине :
- приведенный выше листенер
- собственно NetBeans в режиме ожидания коннекта от xDebug
Из всего приведенного, только одна комбинация (ssh удаленно и listener локально) показывают коннект, что говорит о том, что впринципе туннель жив.
Тестовый скрипт на сервере отваливается по таймауту, xDebug в логи пишет то же самое "E: Time-out connecting to client. :-(", при этом нетстат на сервере видит отправку данных в обоих случаях.
Локально - что листенер, что нетбинс просто занимают порт на LISTEN, и (кроме вышеупомянутой комбинации ssh+листенер) не подают никаких признаков коннекта.
Вопрос:
Что, блин, я еще мог упустить?
Заранее спасибо за любые мысли.
PS и да, мои знания юниксов и сетевых премудростей - достаточно поверхностны, поэтому вполне допускаю, что причина может оказаться идиотской :)
UPD:
промежуточные итоги:
- оттуда удается достучаться с помощью ssh и telnet; в обоих случаях, тестовый листенер на локальной машине принимает соединение, если нетбинсом слушать - он игнорит, но wireshark все-же видит пакеты;
- оттуда НЕ может достучаться xdebug и тестовый скрипт sock.connect(('localhost', 9009)); в обоих случаях SYN_SENT на той стороне и отвал по таймауту, на этой - ноль реакции как в нетстате, так и в wireshark;