Ruby Passenger + Ngnix = зависание. В чем может быть причина?
На сервере установлено и запущено на разных портах два экземпляра Passenger + Ngnix. Один для среды production, второй для среды test.
До недавнего времени все было хорошо. Но примерно с две недели назад, среда test стала повисать раз в 2-3 дня.
Выглядит это так:
При доступе к серверу он долго молчит и говорит 504 Gateway Timeout. При этом в логах ничего. Делаю re-start, и все работает корректно.
Поскольку production среда работает стабильно, полагаю, проблема в каких-то ошибках в коде, который постоянно разрабатывается и тестируется на test-среде. Но понять в чем причина не могу - в логах все чисто.
Какие существуют средства расширенного мониторинга Passenger? Может быть, есть какие-то детальные логи или еще что? Что можно посоветовать в такой ситуации?
попробую угадать, у вас там руби приложение под passenger'ом? включите логирование и смотрите ошибки в development.log (production.log для боевой среды). скорей всего запрос уходит в приложение и там застревает.
I, [2014-06-10T01:39:30.650653 #32506] INFO -- : Started GET "/user/****/admin/helpdesk/statusbar?user_id=5661" for 198.100.*.* at 2014-06-10 01:39:30 -0400
I, [2014-06-10T01:39:30.684116 #32506] INFO -- : Processing by UserAdminHelpdeskController#statusbar as HTML
I, [2014-06-10T01:39:30.684208 #32506] INFO -- : Parameters: {"user_id"=>"5661", "token"=>"****"}
I, [2014-06-10T01:39:33.669684 #32681] INFO -- : Started GET "/user/*****/admin/helpdesk/statusbar?user_id=5661" for 198.100.*.* at 2014-06-10 01:39:33 -0400
I, [2014-06-10T01:39:33.705268 #32681] INFO -- : Processing by UserAdminHelpdeskController#statusbar as HTML
I, [2014-06-10T01:39:33.705358 #32681] INFO -- : Parameters: {"user_id"=>"5661", "token"=>"******"}
И все. Дальше я его завершаю и рестартую. И лог идет дальше, как ни в чем не бывало.
I, [2014-06-10T01:49:07.396657 #1720] INFO -- : Started GET "/user/***/agreements/stat?stat=pp%2C0%2C0%2C%2C%2Ctc%2C0%2C101" for 85.140.*.* at 2014-06-10 01:49:07 -0400
I, [2014-06-10T01:49:07.432364 #1720] INFO -- : Processing by UserController#agreements_stat as */*
I, [2014-06-10T01:49:07.432455 #1720] INFO -- : Parameters: {"stat"=>"pp,0,0,,,tc,0,101", "token"=>"****"}
I, [2014-06-10T01:49:07.591718 #1720] INFO -- : Filter chain halted as :is_user_access_granted rendered or redirected
I, [2014-06-10T01:49:07.591866 #1720] INFO -- : Completed 200 OK in 159ms (Views: 0.3ms | ActiveRecord: 58.6 ms)
Вот, то что нужно, рельсовый лог если я не ошибаюсь. Теперь вам надо отловить ситуацию когда у вас происходит "зависание". Обратите внимание на время ответа, в нормальной ситуации оно у вас на уровне нескольких милисекунд. Во время же 504-х, время ответа наверняка переваливает за несколько тысяч ms. В результате nginx просто не дожидается когда ему ответит приложение и отдает клиенту 504.
Грепните этот лог на предмет больших значений времени ответа.
Но в данном случае, проблема в том, что вызов метода в контроллере фиксируется нормальный, а дальше - все. В лог больше ничего не пишется. Я пробовал несколько раз дожидаться ситуации 504, но в логе последняя строка остается
I, [2014-06-10T01:39:33.705358 #32681] INFO -- : Parameters:{"user_id"=>"5661", "token"=>"******"}
При этом Passenger больше не реагирует ни на что, кроме рестарта. В этом и проблема, что не могу локализовать, в чем проблема. :(