Не удается найти загружаемый объект для модуля main в @INC

в приложении mod_perl, работающем на ubuntu 16.04, через некоторое время, когда все работает нормально (несколько дней), мы получаем фатальное сообщение в errorlog:

не удалось решить обработчик MyHandler::ModPerl20 Не удается найти загружаемый объект для модуля main в @INC

MyHander:: ModPerl20 определяется в блоке местоположения

<Perl>
     unshift @INC, '/path/to/my/code';
</Perl>
<Location ~ "/imp($|/)">
    SetHandler modperl
    PerlResponseHandler MyHandler::ModPerl20
</Location>

версия ubuntu Perl - 5.22. Apache 2.4

может ли это быть проблема? http://blog.feature-addons.de/2016-05-15-otrs-apache-mod-perl-perl-5-22

есть идеи, как это исправить? Мне действительно нужно настроить nginx / uwsgi?

4 ответов


убедится @INC настроен правильно, чтобы найти путь, в котором MyHandler::ModPerl20 установлен (Я думаю, что происходит, когда Apache перерабатывает какой-то ребенок, тот, кто начинает новый, не имеет правильного @INC значение, следовательно, больше не найти ваш модуль).

попробуйте добавить PerlSwitches -I/your/path/for/myhandler/ в httpd.conf, чтобы увидеть, если он устраняет вашу проблему.

если это что-то меняет, посмотрите на настройка @INC в документации modperl, чтобы увидеть все подробности.


Я видел что-то подобное и в других случаях, не только с SAS, но и с другими продуктами.

Я бы попросил вашего системного администратора проверить модули ввода-вывода на вашем сервере Linux. Я думаю, что им нужно переустановить или, возможно, просто проверить разрешения на относительные папки.


изменение конфигурации MPM Apache с mpm_event на mpm_prefork решило мою проблему.


держу пари, ваш код использует CGI.pm и это то, что вызывает его к краху. Запустите код без CGI.pm и код не рухнет.

Я подозреваю, что сценарий Perl вызвал обертку памяти, и сервер должен был паниковать (CGI.pm среди прочего может вызвать это). Таким образом, в коде Perl есть место, которое не обрабатывает определенную ситуацию должным образом.

не будучи в состоянии видеть ваш код, я могу только догадываться, что делать дальше.. Но ты можешь попробовать. включение предупреждения PerlWarn on или PerlSwitches -W в конфигурации используйте strict, warning, добавьте файл, который регистрирует все предупреждения Perl и умирает ошибки.