2017-01-20 10 views
8

В приложении mod_perl работает на убунту 16.04 Через некоторое время, где все функции штрафа (за несколько дней), мы получим фатальную сообщение в ERRORLOG:Не удается найти загружаемый объект для модуля главного в @INC

не удалось разрешить обработчик MyHandler::ModPerl20 не удается найти загружаемый объект для модуля главного в @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?

+0

Это означает, что бинарный компонент модуля (.so) не может быть найден. Как вы установили MyHandler :: ModPerl20? – ikegami

+0

MyHandler :: ModPerl20 - это чистый обработчик Perl, написанный мной. У него нет файла .so. Он работает на той же установке без каких-либо проблем в течение нескольких дней. –

+0

Что такое загружаемый объект 'main' для PerResponseHandler в mod_perl? –

ответ

0

Изменение конфигурации Apache MPM от mpm_event до mpm_prefork позволило решить мою проблему.

-1

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

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

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

+1

Есть ли у вас какие-либо доказательства или это чистая спекуляция? – ThisSuitIsBlackNot

+0

Привет, я не использую CGI.pm. Я использую CGI :: Cookie для создания или анализа файлов cookie. –

2

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

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

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

+0

@INC настроен правильно (я обновил вопрос с использованием кода). Во всяком случае, как он может корректно функционировать для нескольких сотен запросов, а затем сбой с сообщением? И почему Apache/mod_perl ищет модуль в моем Handler? –

+0

Поскольку из-за неопределенной памяти у меня была аналогичная проблема, которая была решена путем изменения способа настройки @INC. Результат может измениться в зависимости от того, как Apache/его ребенок запускается. Вы ничего не теряете, попробовав предложение 'PerlSwitches', предлагаемое и даже поместив ваш модуль myHandler :: ModPerl20 perl в один из путей, жестко закодированных в perl default @INC на вашем сайте, чтобы узнать, исчезли ли проблемы. –

+0

Я не могу представить, что это проблема, извините :(Если @INC ошибается, я бы получил сообщение об ошибке вроде: 'не удалось разрешить обработчик 'MyHandler :: ModPerl20': не удалось найти MyHandler/ModPerl20.pm в @ INC', а не 'Не удается найти загружаемый объект' –

0

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

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

+0

Как проверить IO-модули? Что именно это означает? –