Błąd 503 Service Temporarily Unavailable

  PHP, Webhosting

Przyczyną wyświetlania się błędu „503 Service Temporarily Unavailable“ jest zwykle obciążenie serwera Twoimi skryptami PHP.

Dla każdego webhostingu zarezerwowano na serwerze 7 procesów PHP (10 w ramach pakietu Extra), które mogą działać równolegle. Oznacza to, że w jednym momencie może być przetworzonych maksymalnie 7 żądań o wykonanie skryptów PHP jednej strony. Nie oznacza to jednak, że kolejne żądania będą odrzucane – zostaną ustawione w kolejce oczekujących. W standardowych przypadkach 7 procesów PHP w zupełności wystarcza – jeśli Twoje strony są poprawnie zoptymalizowane i używasz cachowania, nie napotkasz tego problemu.

Może nastać sytuacja, że kolejne żądania nie doczekają się wolnego procesu PHP w danym timeoutie. Oznacza to, że wszystkie 7 procesów PHP bardzo długo coś przetwarza. W tym przypadku nastąpi odrzucenie oczekujących żądań i wyświetlenie błędu 503.

Przyczyny problemu i proponowane rozwiązania

Istotą problemu jest to, że skrypty PHP nie nadążają przetworzyć żądań – a to dlatego, że zbyt duża liczba żądań przypada na liczbę dostępnych skryptów (przeciążona strona), lub z powodu zbyt długiego czasu oczekiwania na przetworzenie żądań.

Jeśli jesteś programistą, spróbuj ustalić, czemu Twoje skrypty poświęcają najwięcej czasu (jaka akcja je blokuje).

Celem jest maksymalne skrócenie czasu wykonywania jednego żądania PHP. Dzięki czemu możliwe jest „obsłużenie” większej liczby żądań w danym czasie.

Możliwe przyczyny problemu i proponowane rozwiązania

  1. Niepoprawnie zoptymalizowana aplikacja PHP. Twoja aplikacja nie jest dostosowana do dużej liczby żądań. Upewnij się, czy używany przez Ciebie system zarządzania treścią umożliwia tzw. cachowanie. Jeśli tak, włącz tę opcję. Znacznie skróci to czas przetwarzania skryptu, znacząco zmniejszy to liczbę zapytań SQL kierowanych do bazy danych, przyspieszając tym samym działanie Twojej strony.
     
  2. Zbyt wiele rekordów w bazie danych – najczęstszą przyczyną jest to, że aplikacja rejestruje w bazie danych wszystkie dostępy odwiedzających lub inne obszerne tego typu statystyki. Nie jest to właściwe, ponieważ powoduje przeciążenie bazy danych, a tym samym spowolnienie działania Twojej strony.
  3. Niewłaściwe tabele, niepoprawne lub brakujące indeksy bazy danych – PHP czeka wtedy bardzo długo na wyniki zapytań SQL (więcej MySQL – optymalizacja wydajności, indeksy).
     
  4. Aplikacja PHP łączy się z zasobami zewnętrznymi, które są niedostępne – np. gdy na stronę pobierane są dane zewnętrzne przez RSS, SOAP itp., ale połączenie z serwerem docelowym nie jest możliwe lub serwer nie odpowiada, ponieważ jest przeciążony – wtedy oczekuje także Twój skrypt.
     
  5. Długi czas wykonywania skryptu wywoływanego cronem – skrypt PHP wywoływany cronem również korzysta z jednego procesu PHP. Jeśli używasz większej liczby cronów lub cron działa długo (przyczyną znowu może być pobieranie danych z zasobów zewnętrznych, które są powolne lub niedostępne w danym momencie), może dojść do zablokowania wszystkich procesów PHP dostępnych dla Twojej strony.
     
  6. Download plików za pośrednictwem skryptu PHP – jeśli swoim odwiedzającym umożliwiasz download plików o dużym rozmiarze przez przekierowanie ich na skrypt PHP, który odczytuje zawartość pliku i przesyła ją do bufora wyjściowego (np. funkcją readfile() lub file_get_contents()), na czas pobierania pliku zajęty zostaje proces PHP. W przypadku, gdy 7 osób będzie pobierało coś w tej samej chwili, dojdzie do wyczerpania wszystkich darmowych procesów. Problem z downloadem rozwiążesz przez linkowanie lub przekierowanie na bezpośredni adres URL danego pliku, a to z pominięciem skryptu PHP.
     
  7. Duża liczba plików o nieodpowiedniej strukturze katalogów – w jednym katalogu nie miałoby się znajdować więcej niż kilka tysięcy pozycji. Przy większej liczbie plików, w szczególności, gdy masz błędnie ustawione cachowanie lub nieprawidłowo zapisane obrazki e-sklepu w katalogu, praca z tymi katalogami i plikami może być znacznie spowolniona. W przypadku dostępności setek tysięcy, czy milionów plików, katalog może być całkowicie niedostępny.
     
  8. Trwa atak na administrację systemu zarządzania treścią, który ma na celu złamanie hasła administratora. Duża liczba prób brute-force złamania hasła obciąża aplikację i zajmuje procesy PHP. Wykrycia tego zjawiska umożliwia accesslog (patrz niżej). W przypadku jego występowania niezbędne jest odfiltrowanie atakującego (np. przez blokadę niektórych adresów IP w htaccess lub na odwrót zezwalając na dostęp do administracji jedynie wybranym adres IP).

Rozwiązaniem tego typu sytuacji może być zmiana wariantu webhostingu na wyższy, tj. na NoLimit Extra – w ramach którego dostępnych jest m.in. 10 procesów PHP, tj. większa wydajność.

Pamiętaj jednak, że wyższy wariant nie przyspieszy działania Twojego skryptu PHP, tj. nie skróci czasu jego wykonywania. Umożliwi Ci jedynie wykonywanie większej liczby skryptów na raz (równolegle). Zmiana wariantu pomoże Ci poradzić sobie z następstwami, ale nie wpłynie na przyczyny tego problemu. Jeśli problemem jest zbyt długi czas wykonywania skryptu (np. rzędu sekund), konieczne będzie zoptymalizowanie aplikacji.

Kiedy błąd pojawi się nagle

Błąd 503 nie zawsze musi być związany z aktualną liczbą odwiedzin na stronie. Częstszą przyczyną jest wczytywanie danych z powolnego lub niedostępnego źródła zewnętrznego, lub czas działania jakiegoś crona, który długo coś wczytuje, aktualizuje, dokonuje konserwacji itp. Przyczyną może być też to, że w jednej chwili będzie przetwarzana duża liczba złożonych żądań (przeszukiwanie dużej bazy danych).

Accesslog, errorlog – jak szukać przyczyny

Na podstawie dziennika błędów nie jesteśmy w stanie ocenić, z jakim problemem mamy do czynienia. Mamy do dyspozycji jedynie rekordy o błędzie 503 =  upłynął limit czasu oczekiwania na wolny proces PHP danego webhostingu.

Dla nas skrypty PHP klienta to czarna skrzynka. Nie wiemy co dzieje się w środku, na co tak długo czekają, ani co tak długo przetwarzają skrypty PHP. Klient sam musi przeanalizować i rozwiązać problem. Pomocne może być dodanie w skrypcie PHP szczegółowego logowania o przetwarzanych żądaniach oraz czasie wykonywania skryptu PHP. Pozwoli to na ustalenie przyczyny spowolnienia całej strony.

W analizie problemu może pomóc Ci accesslog – tj logi dostępów do strony. Znajdziesz tam konkretne żądania i czas ich wykonywania. Accesslog możesz aktywować za pośrednictwem Panelu Klienta (w sekcji usługi dodatkowe w szczegółach konkretnego webhostingu)na 24 godziny za darmo, lub pozostawić aktywny na stałe za dodatkową opłatą.

Byl pro Vás tento návod užitečný?