Błąd wewnętrzny 500 Apache, ale nic w logach?

122

Otrzymuję 500 wewnętrznych błędów serwera, kiedy próbuję wykonać HTTP POST na określony adres w mojej aplikacji. Zajrzałem do dzienników serwera w niestandardowym katalogu dzienników określonym w pliku hostów wirtualnych, ale błąd nie pojawia się tam, więc debugowanie było uciążliwe.

Jak spowodować, aby Apache zapisywał wewnętrzne błędy 500 w dzienniku błędów?

wcolbert
źródło
1
Miałem ten sam problem przy używaniu PHP z wirtualnymi hostami ... brak błędów (Apache2, Ubuntu). Skończyło się na tym, że brakowało modułów PHP (mysql, json itp.)
1
U nas wysyłał je do dziennika dostępu (prawdopodobnie dlatego, że z punktu widzenia Apache działał poprawnie i po prostu przekazywał je dalej, z głębszej warstwy - w naszym przypadku Passenger / Rails). Wystarczy umieścić tę notatkę tutaj, na wypadek gdyby ktoś drapał się po głowie.
Tom Hundt

Odpowiedzi:

-4

Uwaga: oryginalny plakat nie zawierał konkretnie pytania o PHP. Wszystkie odpowiedzi skoncentrowane na PHP przyjmują duże założenia, które nie odnoszą się do rzeczywistego pytania.

Domyślny dziennik błędów, w przeciwieństwie do dzienników błędów skryptów, zwykle zawiera (bardziej) określony błąd. często będzie to odmowa uprawnień lub nawet tłumacz, którego nie można znaleźć.

Oznacza to, że błąd prawie zawsze leży w Twoim skrypcie. np. wgrałeś skrypt Perla, ale nie nadałeś mu uprawnień do wykonywania? a może był uszkodzony w środowisku linuxowym, jeśli napiszesz skrypt w systemie Windows, a następnie prześlesz go na serwer bez konwersji końców linii, otrzymasz ten błąd.

w perlu, jeśli zapomnisz

print "content-type: text/html\r\n\r\n";

otrzymasz ten błąd

Jest ku temu wiele powodów. więc najpierw sprawdź dziennik błędów, a następnie podaj więcej informacji.

Domyślny dziennik błędów często znajduje się w /var/log/httpd/error_loglub /var/log/apache2/error.log.

Powodem, dla którego patrzysz na domyślne dzienniki błędów (jak wskazano powyżej), jest to, że błędy nie zawsze są publikowane w niestandardowym dzienniku błędów, zgodnie z definicją na hoście wirtualnym.

Zakłada Linuksa i niekoniecznie Perla

DeveloperChris
źródło
6
Sprawdziłem serwer ErrorLog i nie ma tam nic do znalezienia.
wcolbert,
1
Masz rację, okazał się problem ze skryptem php. Biblioteka PEAR nie została zainstalowana. Zainstalowałem go na moim VPS i wszystko jest w porządku. Dziękuje wszystkim!
wcolbert,
261
W jaki sposób „proszę sprawdź logi” może być akceptowaną odpowiedzią na „dlaczego moje dzienniki są puste”?
Álvaro González
4
Wskazałem użytkownikowi domyślne dzienniki błędów, a nie niestandardowe dzienniki błędów. Często, gdy skrypt z jakiegoś powodu zawodzi, błąd jest kierowany do domyślnych dzienników błędów
DeveloperChris
1
W PHP nie miałem nic w skonfigurowanych dziennikach błędów Apache, ale znalazłem błędy z grep PHP /var/log/syslog. Prawdopodobnie dlatego, że miałem error_log = syslogw /etc/php5/apache2/php.ini.
mivk
145

Dlaczego 500 wewnętrznych błędów serwera nie jest rejestrowanych w dziennikach błędów Apache?

Błędy powodujące wewnętrzny błąd serwera 500 pochodzą z modułu PHP. Domyślnie PHP NIE rejestruje tych błędów. Powodem jest to, że chcesz, aby żądania internetowe przebiegały tak szybko, jak to fizycznie możliwe, a rejestrowanie błędów w celu sprawdzenia, gdzie mogą je zaobserwować, jest zagrożeniem dla bezpieczeństwa.

Te instrukcje, aby włączyć wewnętrzny błąd serwera rejestrowania się na Ubuntu 12.10z PHP 5.3.10a Apache/2.2.22.

Upewnij się, że logowanie PHP jest włączone:

  1. Znajdź swój plik php.ini:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Edytuj ten plik jako root:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Znajdź tę linię w php.ini:

    display_errors = Off
    
  4. Zmień powyższy wiersz na ten:

    display_errors = On
    
  5. W dolnej części pliku zobaczysz to:

    ;display_startup_errors
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    ;error_reporting
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    
  6. Średniki to komentarze, co oznacza, że ​​linie nie działają. Zmień te linie, aby wyglądały tak:

    display_startup_errors = On
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    error_reporting = E_ALL
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    

    To, co przekazuje PHP, to fakt, że chcemy rejestrować wszystkie te błędy. Ostrzeżenie, nastąpi duży spadek wydajności, więc nie chcesz, aby było to włączone na produkcji, ponieważ rejestrowanie wymaga pracy, a praca wymaga czasu, a czas kosztuje.

  7. Ponowne uruchomienie PHP i Apache powinno zastosować zmianę.

  8. Zrób to, co zrobiłeś, aby ponownie spowodować błąd 500 Internal Server i sprawdź dziennik:

    tail -f /var/log/apache2/error.log
    
  9. Na końcu powinieneś zobaczyć błąd 500, coś takiego:

    [Wed Dec 11 01:00:40 2013] [error] [client 192.168.11.11] PHP Fatal error:  
    Call to undefined function Foobar\\byob\\penguin\\alert() in /yourproject/
    your_src/symfony/Controller/MessedUpController.php on line 249, referer: 
    https://nuclearreactor.com/abouttoblowup
    
Eric Leschinski
źródło
46
display_errorsdrukuje błędy na ekranie . log_errorszapisuje błędy w pliku dziennika .
dzień
11
To powinna być kanoniczna odpowiedź na to pytanie.
David
9
@WanLiqun To całkiem niezła informacja, ale dotyczy tylko PHP, o którym nawet nie wspomniano w pytaniu.
Álvaro González
1
„Błędy powodujące wewnętrzny błąd serwera 500 pochodzą z modułu PHP. Domyślnie PHP NIE rejestruje tych błędów”. Kto wspomniał o PHP? Wyłączenie logowania do serwera 500 w PHP jest przypuszczeniem i najczęściej błędnym założeniem. Apache zarejestruje błędy serwera 500 z modułu powodującego błąd (w tym przypadku php), ale najczęściej trafi do /var/log/apache2/error.log (zakładając debian lub podobny)
DeveloperChris
4
Ta odpowiedź zaczyna się od złej rady, aby zrzucić błędy na ekran.
luqo33
11

Sprawdź dziennik błędów php, który może być oddzielnym plikiem z dziennika błędów Apache.

Znajdź go, przechodząc do phpinfo()i sprawdzając atrybut error_log. Jeśli nie jest ustawiony. Ustaw to: https://stackoverflow.com/a/12835262/445131

Może twój post_max_size jest za mały dla tego, co próbujesz wysłać, lub jedno z pozostałych maksymalnych ustawień pamięci jest za niskie.

jsonH
źródło
1
Pytanie brzmiało: „Jak spowodować, aby Apache rejestrował wewnętrzne błędy 500 w dzienniku błędów?” To prawdopodobnie powinien być komentarz.
jww
11

Właśnie wpadłem na to i było to spowodowane błędną konfiguracją mod_authnz_ldap w moim pliku .htaccess. Absolutnie nic nie było rejestrowane, ale ciągle otrzymywałem błąd 500.

Jeśli napotkasz ten konkretny problem, możesz zmienić poziom dziennika mod_authnz_ldap w następujący sposób:

LogLevel warn authnz_ldap_module:debug

Spowoduje to użycie poziomu dziennika debugowania dla mod_authnz_ldap, ale ostrzeże o wszystkim innym ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).

bmaupin
źródło
1
Pytanie brzmiało: „Jak spowodować, aby Apache rejestrował wewnętrzne błędy 500 w dzienniku błędów?” To prawdopodobnie powinien być komentarz.
jww
Dobra obserwacja. Dodałem instrukcje dotyczące rejestrowania tych błędów.
bmaupin
7

Jeśli informacje o wewnętrznym błędzie serwera nie pojawiają się w plikach dziennika, prawdopodobnie musisz ponownie uruchomić usługę Apache .

Odkryłem, że Apache 2.4 (przynajmniej na platformie Windows) uparcie odmawia opróżnienia plików dziennika - zamiast tego zarejestrowane dane pozostają w pamięci przez dłuższy czas. To dobry pomysł z punktu widzenia wydajności, ale może być mylący podczas programowania.

Álvaro González
źródło
To była dla mnie poprawna odpowiedź w systemie Linux. Nawet po usunięciu oryginalnego pliku error.log (który był plikiem znakowym urządzenia) i zastąpieniu go dotykowym 777 error.log, Apache nie zapisywał do niego, dopóki nie został ponownie uruchomiony.
Adelmar
2

Odpowiedzi @ eric-leschinski są poprawne.

Ale jest inny przypadek, jeśli twój serwer API to FPM / FastCGI (domyślnie w Centos 8 lub możesz sprawdzić, użyj funkcji phpinfo ())

W tym przypadku:

  1. Uruchom phpinfo()w pliku php;
  2. Szukam Loaded Configuration Fileparametrów, aby zobaczyć, gdzie jest plik konfiguracyjny dla twojego PHP.
  3. Edytuj plik konfiguracyjny, taki jak odpowiedź @ eric-leschinski.
  4. Sprawdź Server APIparam. Jeśli twój serwer używa tylko API obsługi apache -> zrestartuj apache. Jeśli twój serwer używa php-fpm, musisz zrestartować usługę php-fpm

    systemctl zrestartuj php-fpm

    Sprawdź plik dziennika w folderze dziennika php-fpm. na przykład/var/log/php-fpm/www-error.log

Ngô Văn Thao
źródło
1

W moim przypadku była to dyrektywa ErrorLog w httpd.conf. Po prostu przypadkowo zauważyłem to już po tym, jak się poddałem. Postanowiłem podzielić się odkryciem) Teraz wiem, gdzie znaleźć błędy 500.

Eugene Lycenok
źródło
Czy możesz podać więcej szczegółów w swojej odpowiedzi
Yahya Hussein
Używam Magento (CMS - Content Management System) dla Apache. Na mojej stronie wystąpił błąd 500 podczas korzystania z podstawowych klas Magento. Nie mogłem znaleźć miejsca, w którym mogłem zobaczyć komunikat o błędzie. Zgodnie z niektórymi odpowiedziami, próbowałem przeszukać dzienniki Apache / etc / httpd / logs / error_log. Ale nic tam nie było. Później dowiedziałem się, że w moim httpd.conf znajduje się linia dla tego konkretnego hosta internetowego, definiująca ścieżkę dziennika: <VirtualHost. ... ErrorLog / usr / www / log / error_log Musiałem więc poszukać bardziej szczegółowego dziennika hosta, a nie zwykłego dziennika Apache.
Eugene Lycenok,
1

Dodaj HttpProtocolOptions Unsafedo pliku konfiguracyjnego Apache i zrestartuj serwer Apache. Pokazuje szczegóły błędu.

Szabla
źródło
0

Sprawdź, czy wersja php, którą używasz, jest zgodna z Twoim kodem. Na przykład w twoim lokalnym środowisku może działać php 5.4 (i wszystko działa dobrze) i być może testujesz swój kod na nowej maszynie z zainstalowanym php 5.3. Jeśli używasz składni 5.4, takiej jak [] dla array (), otrzymasz sytuację, którą opisałeś powyżej.

John Erck
źródło
Pytanie brzmiało: „Jak spowodować, aby Apache rejestrował wewnętrzne błędy 500 w dzienniku błędów?” To prawdopodobnie powinien być komentarz.
jww
0

Spróbuj uzyskać dostęp do pliku statycznego. Jeśli to nie działa, przejdź do wszystkich katalogów z katalogu głównego "/" lub "c: \" do katalogu twojego pliku i sprawdź, czy zawierają one pliki ".htaccess".

Kiedyś zostawiłem plik w "c: \" i miał on najbardziej dziwne wyniki.

Lothar
źródło
1
Pytanie brzmiało: „Jak spowodować, aby Apache rejestrował wewnętrzne błędy 500 w dzienniku błędów?”
jww
0

Sprawdź, czy gdzieś w kodzie wyłączono raportowanie błędów.

W moim kodzie było miejsce, w którym go wyłączyłem, więc dodałem po nim kod debugowania:

require_once("inc/req.php");   <-- Error reporting is disabled here

// overwrite it
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
czarny
źródło