Я использую Ubuntu 16.04 LTS с httpd 2.4 и mod_perl2 для размещения PerlAuthenHandler для некоторого веб-приложения. Это было 14.04 LTS раньше и было обновлено несколько недель назад.
В целом это работает, но иногда, особенно при перезагрузке и перезапуске httpd, у mod_perl возникают проблемы во время компиляции моего обработчика, что приводит к ошибкам, так что, пока httpd продолжает работать, mod_perl находится в состоянии, которое больше не в состоянии что-либо обрабатывать. Поскольку mod_perl использует несколько интерпретаторов во время выполнения, и некоторые из них могут использоваться впервые при любом запросе, компиляция может произойти даже без перезагрузки / перезапуска самой службы httpd. Но, похоже, это не так часто по сравнению с тем фактом, что по крайней мере перезагрузка httpd происходит один раз в день утром из-за ротации журналов.
Эти ошибки компиляции происходят не всегда, а иногда только иногда. Обработчик может работать хорошо в течение нескольких дней, и во время перезагрузки ротации журналов он просто перестает работать. Или то же самое с перезапуском httpd: в большинстве случаев это также работает нормально, но иногда ошибки компиляции в mod_perl уже происходят во время такого перезапуска. В большинстве случаев эти ошибки исчезают с дополнительным перезапуском впоследствии.
Ошибки не происходят непосредственно в моем собственном коде, но всегда только в библиотеках, которые я use
, поэтому во время компиляции. Эти библиотеки устанавливаются не с использованием CPAN или чего-то подобного, а с помощью менеджера пакетов моего дистрибутива, что должно быть самой "правильной" и совместимой вещью, которую можно сделать. Конечно, эти библиотеки и мой собственный код не меняются между рабочим / не рабочим циклами, на самом деле нет абсолютно никакой разницы в том, что установлено, даже в автоматических обновлениях безопасности или тому подобном. Кажется, по какой-то причине он просто перестает работать.
Сами ошибки никогда не являются проблемами времени выполнения, но на самом деле всегда касаются компиляции исходного кода, например, синтаксические ошибки в Perl-коде и тому подобное. И, конечно, ошибки не всегда одинаковы, хотя кажется, что некоторые из них встречаются чаще, чем другие.
Пример 1:
[Mon Jun 05 06:25:23.818862 2017] [core:notice] [pid 21652:tid 139994496042880] AH00094: Command line: '/usr/sbin/apache2'
String found where operator expected at /usr/share/perl/5.22/Tie/Hash.pm line 25, near "croak "$pkg must define either a TIEHASH() or a new() method""
(Do you need to predeclare croak?)
String found where operator expected at /usr/share/perl/5.22/Tie/Hash.pm line 33, near "croak "$pkg doesn't define a TIEHASH method""
(Do you need to predeclare croak?)
String found where operator expected at /usr/share/perl/5.22/Tie/Hash.pm line 39, near "croak "$pkg doesn't define an EXISTS method""
(Do you need to predeclare croak?)
[Mon Jun 05 16:14:21.233643 2017] [mpm_event:notice] [pid 21652:tid 139994496042880] AH00491: caught SIGTERM, shutting down
Пример 2:
[Tue Jun 06 06:25:23.200424 2017] [core:notice] [pid 7051:tid 139688717936512] AH00094: Command line: '/usr/sbin/apache2'
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 199, near "croak 'Usage: ($fh, $name) = _gettemp($template, OPTIONS);'"
(Do you need to predeclare croak?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 221, near "carp "File::Temp::_gettemp: template must not be a reference""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 228, near "carp "File::Temp::_gettemp: Must have even number of options""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 482, near "croak 'Usage: _replace_XX($template, $ignore)'"
(Do you need to predeclare croak?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 808, near "croak 'Usage: _deferred_unlink($fh, $fname, $isdir)'"
(Do you need to predeclare croak?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 835, near "carp "Request to remove directory $fname could not be completed since it does not exist!\n""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 848, near "carp "Request to remove file $fname could not be completed since it is not there!\n""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 993, near "croak "'tempfile' can't be called as a method""
(Do you need to predeclare croak?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 1080, near "croak "Error in tempfile() using template $template: $errstr""
(Do you need to predeclare croak?)
String found where operator expected at /usr/share/perl/5.22/File/Temp.pm line 1111, near "croak "Error unlinking file $path using unlink0""
[Tue Jun 06 07:54:18.220486 2017] [mpm_event:notice] [pid 7051:tid 139688717936512] AH00491: caught SIGTERM, shutting down
Пример 3:
[Tue Jun 06 11:17:40.789534 2017] [core:notice] [pid 4498:tid 139925979752320] AH00094: Command line: '/usr/sbin/apache2'
String found where operator expected at /usr/share/perl/5.22/SelectSaver.pm line 10, near "croak 'usage: SelectSaver->new( [FILEHANDLE] )'"
(Do you need to predeclare croak?)
[Tue Jun 06 11:25:25.344061 2017] [mpm_event:notice] [pid 4498:tid 139925979752320] AH00491: caught SIGTERM, shutting down
Пример 4:
[Tue Jun 06 12:09:54.763670 2017] [core:notice] [pid 16855:tid 139853164218240] AH00094: Command line: '/usr/sbin/apache2'
String found where operator expected at (eval 10) line 2, near "croak 'usage: $io->getline()'"
(Do you need to predeclare croak?)
String found where operator expected at (eval 10) line 8, near "croak 'usage: $io->getlines()'"
(Do you need to predeclare croak?)
String found where operator expected at (eval 10) line 10, near "croak 'Can\'t call $io->getlines in a scalar context, use $io->getline'"
(Do you need to predeclare croak?)
String found where operator expected at /usr/share/perl5/Config/IniFiles.pm line 400, near "carp "Invalid -import value \"$parms{-import}\" was ignored.""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl5/Config/IniFiles.pm line 446, near "carp "Comment character must be unique.""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl5/Config/IniFiles.pm line 451, near "carp "Illegal comment character.""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl5/Config/IniFiles.pm line 461, near "carp "Illegal value for -allowedcommentchars.""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl5/Config/IniFiles.pm line 482, near "carp "Unknown named parameter $k=>$v""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl5/Config/IniFiles.pm line 768, near "carp "Unhandled data structure in $ref, cannot _deepcopy()""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl5/Config/IniFiles.pm line 1273, near "carp "Failed to open $self->{cf}: $!""
(Do you need to predeclare carp?)
String found where operator expected at /usr/share/perl5/Config/IniFiles.pm line 1769, near "carp "Unable to rename temp config file ($new_file) to ${filename}: $!""
(Do you need to predeclare carp?)
[Tue Jun 06 12:10:23.827500 2017] [mpm_event:notice] [pid 16855:tid 139853164218240] AH00491: caught SIGTERM, shutting down
Иногда ошибка даже утверждает, что строка 4 в следующем коде parent.pm
неверна, поскольку $VERSION
не определено:
package parent;
use strict;
use vars qw($VERSION);
$VERSION = '0.232';
sub import {
Так что, в конце концов, это кажется случайным из-за внутренних ошибок в компиляторе mod_perl или из-за неправильного внутреннего состояния или чего-то подобного.
Любые идеи о том, как я могу отладить и найти причину проблемы? Или идеи о том, что проблема на самом деле может быть уже?