Chyba 503 Service Temporarily Unavailable

Popis situace, kdy dojde k vyčerpání systémových prostředků pro běh PHP skriptů daného webu. Návod k řešení pomalých a nestíhajících webů, rady pro optimalizaci PHP aplikací.

Datum: 20.01.2011


Pokud se setkáváte u vašeho webu s chybou "503 Service Temporarily Unavailable", většinou to znamená problém s vytěžováním serveru vašimi PHP skripty.

Každý webhosting má na serveru rezervováno 5 PHP procesů, které mohou běžet paralelně. To znamená, že v jeden okamžik může být zpracováváno nejvýše 5 požadavků na vykonání PHP skriptu jednoho webu. Avšak to neznamená, že by další požadavky byly odmítány - zařadí se do fronty a počkají, až se na ně dostane. Za normálních okolností je 5 PHP procesů zcela dostatečných - máte-li správně optimalizované stránky a používáte cachování, na tento problém nenarazíte.

Může se stát, že další požadavky se volného PHP procesu v nějakém timeoutu nedočkají. Což znamená, že všech 5 PHP procesů něco velmi dlouho dělá. Pak jsou čekající požadavky po nějaké době odmítnuty s chybou 503.

Příčiny problému a řešení

Podstata problému je taková, že PHP skripty na vašem webu nestíhají odbavovat požadavky - buď proto, že je toho na ně moc (příliš vytížený web), nebo proto, že z nějakého důvodu na něco dlouho čekají.

Pokud jste programátor, pokuste se zjistit, čím vaše PHP skripty tráví nejvíce času (na jaké akci jsou zablokované)

Cílem je co nejvíce zkrátit dobu vykonávání jednoho PHP požadavku. Tím budete moci "odbavit" více požadavků v čase.

Možné příčiny a jejich řešení:

  1. Nesprávně optimalizovaná PHP aplikace. Vaše aplikace není přizpůsobena pro velký počet požadavků. Zjistěte, zda vámi používaný redakční systém umožňuje tzv. cachování. Pokud ano, zapněte jej. Výrazně to zkrátí dobu provádění skriptu, často to radikálně sníží počet prováděných SQL dotazů do databáze a výrazně celkově urychlí vaše stránky - viz. např. cachování ve WordPressu.
     
  2. Příliš mnoho záznamů v databázi - typickým problémem je, že si aplikace zaznamenává všechny přístupy návštěvníků či nějaké podobné rozsáhlé statistiky do databáze, což je zcela nevhodné, databázi to velmi zatěžuje a vaše stránky postupem času výrazně zpomaluje.
     
  3. Nevhodné databázové tabulky, nesprávné či chybějící databázové indexy - PHP pak velmi dlouho čeká na výsledky SQL dotazů (viz. MySQL - optimalizace výkonu, indexy).
     
  4. PHP aplikace se připojuje k externímu zdroji, který je nedostupný - např. když na stránky stahujete externí data přes RSS, SOAP apod., ale s cílovým serverem se není možné spojit nebo neodpovídá či je přetížený - pak čeká i váš PHP skript
     
  5. Dlouho běžící skript volaný cronem - také PHP skript, volaný cronem, obsadí při svém vykonávání jeden PHP proces. Pokud máte větší množství cronů nebo cron běží dlouho (opět to může být proto, že v něm stahujete data z externího zdroje, který je pomalý nebo momentálně nedostupný), může taktéž dojít k zablokování všech PHP procesů dostupných pro váš web.
     
  6. Download souborů zprostředkovaný přes PHP skript - pokud vašim návštěvníkům nabídnete download nějakých velkých souborů tak, že je odkážete na PHP skript, který čte obsah soubru a posílá jej na výstup (např. funkcemi readfile() nebo file_get_contents()), pak tím na dobu stahování obsadíte tento PHP proces. Pokud tedy bude něco stahovat 5 lidí v jednom okamžiku, již není žádný volný PHP proces. Download řešte odkázáním nebo přesměrováním na přímou URL adersu daného souboru tak, aby download nešel skrz PHP skript.
     
  7. Velké množství souborů v nevhodné adresářové struktuře - v jednom adresáři by se nemělo nacházet více než řádově tisíce položek. Při větším počtu, zejména pokud máte nesprávně nastavené cachování či nesprávně uložené obrázky e-shopu v jednom adresáři, se může práce s těmito adresáři a soubory radikálně zpomalit. Při stovkách tisíc či milionech položek je pak takový adresář zcela nepoužitelný.
     
  8. Na administraci redakčního systému je veden útok za účelem prolomení administrátorského hesla. Velké množství brute-force pokusů o prolomení hesla zatěžuje aplikace a obsazuje PHP procesy. Tuto situaci odhalíte v accesslogu (viz. dále), následně lze útočníka odfiltrovat (např. zakázáním některých IP adres v htaccess či naopak povolením jen vašich IP adres do administrace).

Řešením této situace může být také přechod na vyšší variantu webhostingu NoLimit Extra - ten mimo jiné nabízí 10 PHP procesů, tedy vyšší výkon.

Avšak pozor na to, že tato vyšší varianta neurychlí vaše skripty, tedy nezkrátí čas vykonávání vašeho PHP skriptu. Pouze umožní, aby bylo v jeden okamžik vašich skriptů vykonáváno více zároveň (paralelně). Může to tedy řešit následky, ale nikoliv příčinu. Pokud je problém v tom, že doba běhu vaše skriptu je příliš dlouhá (např. v řádu sekund), je potřeba zejména aplikaci zoptimalizovat.

Když se náhle objeví tato chyba

Chyba 503 vůbec nemusí souviset s aktuální návštěvností nebo (ne)změnou na webu. Častější příčiny jsou načítání nějakých dat z pomalého nebo nedostupného externího zdroje či běh nějakého cronu, který dlouho něco načítá, aktualizuje, provádí údržbu apod. Příčinou může být také to, že se náhodně sejde větší množství složitých požadavků (vyhledávání v obsáhlé databázi).

Accesslog, errorlog a jak hledat příčinu

My z chybového logu na serveru nepoznáme jaký je konkrétně problém. Uvidíme v něm jen záznamy o chybě 503 = vypršel timeout při čekání na volný PHP proces daného webhostingu.

Pro nás jsou PHP skripty zákazníků černá skříňka. My nevíme co se uvnitř děje, na co PHP skripty dlouho čekají nebo co tak dlouho dělají. Analýzu a vyřešení problému si musí provést zákazník sám. Například je vhodné zavést v PHP skriptu podrobné logování jaké požadavky se zpracovávají a jak dlouho trval běh PHP skriptu. Tak se dá postupně odhalit co tak dlouho trvá a co celý web zdržuje.

V analýze problému vám může pomoci accesslog - tedy log přístupů na stránky. Tam uvidíte konkrétní požadavky a dobu jejich vykonávání. Accesslog si můžete zdarma na 24 hodin aktivovat v zákaznické administraci (v příplatkových službách v detailu konkrétního webhostingu), popř. jej můžete mít aktivní trvale za příplatek.

Diskuze k článku (18)

NávrhL. Kubica06.03.14 01:12
Chyba 503Patrik16.02.14 16:32
chyba streemu-Chyba 503andre17.11.13 19:15
  Re: chyba streemu-Chyba 503Petr Šťastný, WEDOS17.11.13 19:21
  Re: chyba streemu-Chyba 503tonda25.12.13 19:04
Streamování videa / Resume stahováníJindřich Petřík18.11.11 11:55
  Re: Streamování videa / Resume stahováníPetr Šťastný, WEDOS18.11.11 12:51
  Re: Streamování videa / Resume stahováníTO neřeš :D03.02.14 21:34
alias multihostingpeter15.11.11 22:05
  Re: alias multihostingJosef Grill, WEDOS15.11.11 22:22
5 procesůRotacak01.02.11 22:38
  Re: 5 procesůJosef Grill, WEDOS01.02.11 23:05
    Re: 5 procesůJozef19.12.11 03:47
      Re: 5 procesůPetr Smetana, WEDOS19.12.11 09:10
        Re: 5 procesůJakub11.01.13 12:56
          Re: 5 procesůPetr Šťastný, WEDOS11.01.13 13:03
            Re: 5 procesůMartin Nakládal14.04.13 20:29
              Re: 5 procesůJosef Grill, WEDOS14.04.13 22:59

Přihlášení zákazníka

Nemáte ještě zákaznický účet? Registrace

Copyright © WEDOS, 2014

Facebook RSS