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?
apache
error-logging
wcolbert
źródło
źródło
Odpowiedzi:
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
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_log
lub/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
źródło
grep PHP /var/log/syslog
. Prawdopodobnie dlatego, że miałemerror_log = syslog
w/etc/php5/apache2/php.ini
.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.10
zPHP 5.3.10
aApache/2.2.22
.Upewnij się, że logowanie PHP jest włączone:
Znajdź swój plik php.ini:
Edytuj ten plik jako root:
Znajdź tę linię w php.ini:
Zmień powyższy wiersz na ten:
W dolnej części pliku zobaczysz to:
Średniki to komentarze, co oznacza, że linie nie działają. Zmień te linie, aby wyglądały tak:
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.
Ponowne uruchomienie PHP i Apache powinno zastosować zmianę.
Zrób to, co zrobiłeś, aby ponownie spowodować błąd 500 Internal Server i sprawdź dziennik:
Na końcu powinieneś zobaczyć błąd 500, coś takiego:
źródło
display_errors
drukuje błędy na ekranie .log_errors
zapisuje błędy w pliku dziennika .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/445131Moż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.
źródło
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:
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 ).
źródło
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.
źródło
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:
phpinfo()
w pliku php;Loaded Configuration File
parametrów, aby zobaczyć, gdzie jest plik konfiguracyjny dla twojego PHP.Sprawdź
Server API
param. 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-fpmSprawdź plik dziennika w folderze dziennika php-fpm. na przykład
/var/log/php-fpm/www-error.log
źródło
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.
źródło
Dodaj
HttpProtocolOptions Unsafe
do pliku konfiguracyjnego Apache i zrestartuj serwer Apache. Pokazuje szczegóły błędu.źródło
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.
źródło
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.
źródło
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:
źródło