2017-01-20 20 views
8

W aplikacji mod_perl działa na ubuntu 16.04 po pewnym podczas, gdzie wszystko działa w porządku (kilka dni) otrzymujemy śmiertelny post w errorlog:nie można zlokalizować obiekt na ładowalny moduł główny w @ INC

udało się rozwiązać obsługi MyHandler::ModPerl20 nie można zlokalizować obiekt na ładowalny moduł główny w @ INC

MyHander :: ModPerl20 jest zdefiniowana w bloku lokalizacji

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

Wersja Ubuntu Perl ma wersję 5.22. Apache 2.4

Czy to może być problem? http://blog.feature-addons.de/2016-05-15-otrs-apache-mod-perl-perl-5-22

Wszelkie pomysły, jak to naprawić? Czy naprawdę muszę skonfigurować nginx/uwsgi?

+0

Oznacza to, że nie można odnaleźć binarnej składowej modułu (.so). Jak zainstalowałeś MyHandler :: ModPerl20? – ikegami

+0

MyHandler :: ModPerl20 jest czystym handlem Perla napisanym przeze mnie. Nie ma żadnego pliku .so. Działa przez tę samą instalację bez żadnych problemów przez kilka dni. –

+0

Co to jest ładowalny obiekt "main" dla PerResponseHandler w mod_perl? –

Odpowiedz

0

Zmiana konfiguracji Apache MPM z mpm_event na mpm_prefork rozwiązała mój problem.

-1

Założę się, że twój kod używa CGI.pm i właśnie to powoduje awarię. Uruchom kod bez kodu CGI.pm, a kod nigdy się nie zawiedzie.

Podejrzewam, że skrypt Perla wywołał zawijanie pamięci i serwer musiał wpadać w panikę (między innymi może to powodować CGI.pm). Tak Istnieje miejsce w kodzie Perla, które nie obsługuje właściwie określonej sytuacji.

Nie będąc w stanie zobaczyć swój kod mogę się tylko domyślać, co robić od teraz .. Ale można spróbować włączeniem ostrzegawczy na PerlWarn on lub PerlSwitches -W w config, należy surowe, ostrzegając, dodaj plik dziennika wszystko od Perl ostrzeżenia i umrzeć błędy.

+1

Czy masz jakieś dowody lub czy to czysta spekulacja? – ThisSuitIsBlackNot

+0

Witam, nie używam CGI.pm - używam tylko CGI :: Cookie do generowania lub parsowania plików cookie. –

2

Upewnij @INC jest poprawnie skonfigurowany, aby wybrać ścieżkę, w której jest zainstalowany MyHandler::ModPerl20 (myślę, że to, co się dzieje, że kiedy Apache przetwarza pewne dziecko, jeden zaczynając świeży nie mają prawidłową wartość @INC, stąd nie znalezienie twojego modułu już).

Spróbuj dodać plik PerlSwitches -I/your/path/for/myhandler/ w pliku httpd.conf, aby sprawdzić, czy rozwiązuje problem.

Jeśli to zmieni sytuację, zajrzyj do Adjusting @INC w dokumentacji modperl, aby zobaczyć wszystkie szczegóły.

+0

@INC jest poprawnie skonfigurowany (zaktualizowałem pytanie za pomocą użytego kodu). W każdym razie, jak to mogło działać poprawnie dla kilkuset zgłoszeń, a następnie zawieszać się z przekazanym komunikatem? I dlaczego Apache/mod_perl szuka modułu głównego w moim Handler'u? –

+0

Ponieważ z mglistej pamięci miałem podobny problem, który został rozwiązany przez zmianę sposobu ustawienia @INC. Wynik może się zmienić w zależności od tego, jak Apache/jego dziecko jest uruchamiane. Nic nie tracisz, próbując sugerować sugerowane "PerlSwitches", a nawet umieszczając swój moduł MyHandler :: ModPerl20 perl na jednej ze ścieżek zakodowanych domyślnie @INC na twojej stronie, aby sprawdzić, czy to sprawi, że twój problem zniknie. –

+0

Nie mogę sobie wyobrazić, że to jest problem, przepraszam :(JEŻELI @INC się nie powiedzie, otrzymam komunikat o błędzie: 'nie udało się rozwiązać handler'a 'MyHandler :: ModPerl20': Nie mogę zlokalizować MyHandler/ModPerl20.pm w @ INC', a nie 'Nie można zlokalizować ładowalnego obiektu' –

0

Widziałem coś podobnego w innych czasach, nie tylko z SAS, ale także z innymi produktami.

Chciałbym poprosić administratora systemu o sprawdzenie modułów IO na serwerze Linux. Myślę, że wymagają one ponownej instalacji, a może po prostu sprawdzenia autoryzacji w odpowiednich folderach.

+0

Jak można sprawdzić moduły IO? Co dokładnie oznacza to? –