Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > FastCGI, скрипт стал отваливаться по таймауту


Автор: ochnev 20.9.2008, 17:56
Есть на одном сервере 2 разных сайта на Perl с FastCGI. Движки почти одинаковые.
Один сайт работает нормально, а во втором неожиданно сломался скрипт. Сам скрипт я не трогал. Скрипт на сервере не изменялся с того момента, как он работал.
Кликаю по ссылке, начинается ожидание, скрипт умирает по таймауту.
Остальные FastCGI-скрипты на том же сайте работают нормально, умирает только один.

Перезапуск Apache не помогает, перезагрузка сервера (бессмысленно, но надо было попробовать) тоже ничего не меняет.

Я подумал уже, что винт на сервере попортился. Зашёл по SSH, в Midnight Commander'е посмотрел содержимое скрипта и шаблона страницы, - всё открылось, файлы прочитались, значит причина не в этом.

Что делать?

Истории предшествовало нашествие робота Yahoo, равносильное DOS-атаке. Файл robots.txt я подредактировал, чтобы закрыть сайт от этого робота, - бесполезно.
(Умер, кстати, тот самый скрипт, страницу которого часами активно дёргал поганый робот.)
Я много раз перезапускал httpd, чтобы как-то сбросить уродского паразита. Могло при этом что-то сломаться? Глупо, конечно, но вдруг есть какой-то баг в Apache или в mod_fastcgi, когда от перезапуска что-то ломается. Может быть, где-то временный файл какой-нибудь надо удалить?

Что делать?

Автор: ochnev 20.9.2008, 18:26
Попробовал накрыть файл, лежащий на сервере точно таким же файлом с локальной машины (дата там другая, более новая) и перезапустил Apache (для FastCGI это надо).
Сначала сработало, ожил скрипт.
Теперь опять сдох. Опять перезапустил Apache - скрипт опять ожил.

Хоть сиди дежурь, Apache перезапускай каждый раз.

Автор: ginnie 22.9.2008, 11:47
Уважаемый ochnev, а в логе ошибок web-сервера есть что-нибудь?

Автор: gcc 22.9.2008, 12:11
может быть не "прибитых" процессов много...
приоритет к памяти какой? и сколько памяти ОЗУ,  32 метра?

Автор: ochnev 11.11.2008, 23:21
Видимо, я понял, в чём было дело.
Внутри цикла 
Код

while (my $query = CGI::Fast->new()) {
  # ...
  # основной код
  # ...
}

в некоторых случаях по условию срабатывал оператор exit.
После этого с процессами что-то случалось, и в итоге скрипт намертво вис. Там потом получалась куча процессов, соседний сайт на том же сервере даже иногда ложился под нагрузкой.

Теперь скрипт переписан, всё вроде OK.

Автор: tolkien 12.11.2008, 06:47
Хех это баг CGI::Fast? Или Apache?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)