Мы только что портировали довольно большую кодовую базу из древней среды Perl 5.005.03 CGI в mod_perl 2, и теперь, когда она находится в публичной бета-версии, есть несколько, возможно связанных, проблем, с которыми мы время от времени сталкиваемся , Они накапливаются до тех пор, пока мы не перезапустим сервер.
Весь наш код компилируется под строгим использованием, но ранее он назывался как скомпилированный, запускаемый и отбрасываемый CGI-скрипт. Проблемы, с которыми мы столкнулись до сих пор: установка $|
или вызов STDOUT->autoflush(1);
с использованием глобальных файловых дескрипторов старого стиля (open(ERRORFILE, $errorfile)
вместо open(my $fh_error, $errorfile)
). Также звоните system()
- вскоре после того, как мы начали публичную бета-версию, мы заметили, например, Прослушивание / bin / tail или / usr / sbin / sendmail на портах 80 и 443 остановило перезапуск сервера. С тех пор я переписал этот код для использования методов чистого Perl, и у нас больше нет этой проблемы.
Осталось две проблемы. Во-первых, журналы заполнены mod_perl с жалобами на переопределение констант, например,
Constant subroutine ModPerl::ROOT::ModPerl::PerlRun::usr_local_..._cgi_forgotpassword::O_CREAT redefined at /usr/lib/perl5/ModPerl/Util.pm line 69.
Кроме того, иногда, казалось бы, основные переменные будут уничтожены. Один из наших основных внутренних модулей регистрирует информацию о PID и имени скрипта, и выдает такую информацию:
20090202-233948-32154:Started script /usr/local/.../cgi/account/renewalcalendar
20090202-233948-32154:Ended script /usr/sbin/apache2
В других случаях идентификатор процесса заканчивается как undef
. Это редко и периодически.
Во-вторых, а также периодически мы будем видеть, что сборщик мусора не запускается. (Возможно, проблема со слабыми ссылками? Но почти все время все работает нормально.) Самый непосредственный признак этого - открытые дескрипторы базы данных, которые никогда не закрывался, но когда я углубляюсь в проблему, становится очевидно, что в стандартном хеш-объекте Perl хранится объект DBI, и метод DESTROY
этого объекта (редко и периодически) не вызывается.
Мы работаем с Debian 5.0 (Lenny), Perl 5.10.0, Apache 2.29, mod_perl 2.0.4, openSSL 0.9.8g. Я могу предоставить больше информации, если это необходимо, но я думаю, что это основа.
Существенные части конфигурации apache, такие как / etc / apache2 / sites-enabled / * sitename *, (некоторые биты отредактированы по соображениям конфиденциальности):
<VirtualHost ...:443>
<Directory />
Options SymLinksIfOwnerMatch
AllowOverride None
</Directory>
<Directory /usr/local/.../cgi>
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
PerlOptions +ParseHeaders
Options +ExecCGI
</Directory>
</VirtualHost>
Там есть кое-что по SSL, переписыванию и перенаправлению, но это важная вещь.
Звучит ли это кому-нибудь знакомо? Кроме того, кто-нибудь может порекомендовать какой-либо способ отладки проблемы дальше?