Błąd 500 Internal Server Error oznacza, że serwer odebrał żądanie, ale podczas jego obsługi coś przerwało działanie aplikacji, a serwer nie potrafi określić bardziej konkretnej przyczyny. Komunikat w przeglądarce niczego nie wyjaśnia, bo ze względów bezpieczeństwa szczegóły trafiają wyłącznie do logów. Przy awariach stron klientów błąd 500 jest jednym z najczęstszych zgłoszeń, a jego przyczynę prawie zawsze da się znaleźć w kilka minut, jeśli wie się, gdzie szukać. W tym wpisie pokazuję, jak diagnozuję i naprawiam błąd 500 krok po kroku.
Dlaczego serwer zwraca błąd 500
Błąd 500 to kod ogólny, do którego trafia wszystko, co zatrzymało aplikację po stronie serwera. W praktyce przyczyny układają się w kilka powtarzalnych grup:
| Przyczyna | Typowa sytuacja | Gdzie ją widać |
|---|---|---|
| błąd krytyczny w kodzie | aktualizacja wtyczki lub motywu, literówka w pliku, wywołanie nieistniejącej funkcji | log błędów PHP lub aplikacji |
| zmiana wersji PHP | hosting podniósł wersję PHP, a stary kod używa usuniętych funkcji | log błędów PHP |
błędna reguła w .htaccess | literówka w RewriteRule albo dyrektywa nieobsługiwana przez serwer | log błędów Apache |
| limity zasobów | za mało pamięci (memory_limit) albo za krótki czas wykonania skryptu | log błędów PHP, komunikat „Allowed memory size exhausted” |
| uprawnienia plików | po przeniesieniu strony pliki mają złych właścicieli albo zbyt szerokie uprawnienia | log błędów serwera |
| baza danych | brak połączenia, złe dane logowania po migracji, uszkodzona tabela | log aplikacji, log bazy danych |
Jak diagnozuję i naprawiam błąd 500
1. Sprawdzam zasięg awarii
Najpierw ustalam, czy błąd dotyczy całej strony, czy tylko wybranych adresów, np. panelu administracyjnego albo koszyka. Sprawdzam to poleceniem, które pokazuje sam kod odpowiedzi:
curl -I https://example.pl/
curl -I https://example.pl/koszyk/
Błąd na całej stronie wskazuje zwykle na konfigurację serwera, .htaccess albo błąd ładowany przy każdym żądaniu, np. we
wtyczce. Błąd na jednym adresie wskazuje na kod konkretnej funkcji.
2. Czytam log błędów
To najważniejszy krok, bo log niemal zawsze podaje plik i linię, w której aplikacja się zatrzymała. W zależności od serwera szukam w:
/var/log/apache2/error.loglub/var/log/httpd/error_logna Apache,/var/log/nginx/error.logoraz logu PHP-FPM na Nginx,- zakładce z logami w panelu hostingu, gdy nie mam dostępu do serwera,
- pliku
wp-content/debug.logw WordPressie po włączeniu zapisu błędów.
tail -n 50 /var/log/nginx/error.log
tail -f /var/log/php8.3-fpm.log
W WordPressie włączam zapis błędów do pliku, ale bez wyświetlania ich odwiedzającym:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Jak czytać i filtrować wpisy w logach, pokazuje analiza logów serwera, a od komunikatu do konkretnej linii kodu dochodzę tak samo, jak przy każdym zadaniu, w którym trzeba debugować kod JavaScript i PHP.
3. Wykluczam najczęstsze przyczyny
Gdy logu nie ma albo nic nie wyjaśnia, sprawdzam po kolei:
- Ostatnią zmianę. Aktualizacja wtyczki, motywu albo wdrożenie nowego kodu to najczęstszy początek awarii. Cofam ją albo przywracam poprzednią wersję z repozytorium.
- Wtyczki w WordPressie. Gdy panel nie działa, zmieniam nazwę katalogu
wp-content/plugins. Jeśli strona wraca, włączam wtyczki pojedynczo, aż błąd się powtórzy. - Plik
.htaccess. Zmieniam jego nazwę i sprawdzam stronę. Jeśli błąd znika, przywracam reguły po kolei. Wadliwą regułę porównuję z poprawnymi wzorcami, które stosuję w pliku .htaccess. - Wersję PHP. Jeśli hosting zmienił wersję PHP, tymczasowo wracam do poprzedniej i aktualizuję kod, który z nową nie działa.
- Limity. Przy komunikacie o wyczerpaniu pamięci zwiększam
memory_limit, ale równolegle szukam, co ją zużywa, bo podnoszenie limitu bez końca ukrywa problem. - Uprawnienia. Katalogi ustawiam na 755, pliki na 644 i sprawdzam, czy właścicielem jest użytkownik, z którego działa serwer.
Błąd 500 a widoczność w Google
Krótka awaria nie szkodzi widoczności. Gdy jednak Googlebot przez dłuższy czas dostaje błędy 5xx, ogranicza częstotliwość odwiedzin,
a adresy, które zwracają błąd przez wiele dni, mogą wypaść z indeksu. Dlatego po każdej poważniejszej awarii sprawdzam raport
indeksowania stron i statystyki indeksowania w Search Console. Przy planowanych pracach technicznych nie zostawiam strony z błędem 500,
tylko zwracam błąd 503 z nagłówkiem Retry-After, który informuje
wyszukiwarkę, że niedostępność jest chwilowa.
Pozostałe błędy HTTP
Każdy kod błędu wskazuje na inną warstwę, więc diagnozę zaczynam od innego miejsca. Diagnoza pozostałych błędów: