ERR_EMPTY_RESPONSE: příčiny a opravy
ERR_EMPTY_RESPONSE znamená, že spojení bylo přijato, ale server poslal zpátky nula bajtů, ne řádnou HTTP odpověď nebo dokonce chybovou stránku. TCP handshake se povedl; cokoli mělo na požadavek odpovědět, to nikdy neudělalo.
Co znamená ERR_EMPTY_RESPONSE
Tahle chyba sedí v životním cyklu požadavku později než odmítnuté nebo časově vypršelé spojení. Prohlížeč se k serveru úspěšně připojí a u požadavku HTTPS se obvykle dokončí i TLS handshake, ale poté, co je požadavek odeslán, se spojení uzavře bez jakékoli HTTP status řádky, hlaviček i těla. To se liší od chybové stránky 500 nebo 502, což je pořád kompletní HTTP odpověď; tady není co zpracovat, protože se vůbec nic nevrátilo.
To dělá ERR_EMPTY_RESPONSE hůř diagnostikovatelnou ze strany klienta než většinu chyb spojení, protože každá vrstva až po transportní spojení včetně fungovala správně. Chyba sedí konkrétně v tom, co má generovat HTTP odpověď: v procesu aplikace, frameworku zpracovávajícím požadavek, nebo v proxy před ním, která socket uzavřela, místo aby předala dál, nebo vygenerovala, řádnou chybovou stránku.
Jak se chyba projevuje
Chrome zobrazí "This site can't be reached ... ERR_EMPTY_RESPONSE" ve chvíli, kdy se spojení uzavře bez dat. curl hlásí stejný stav prostými slovy:
curl -v https://example.com/api/generate
* Connected to example.com (203.0.113.10) port 443
> GET /api/generate HTTP/1.1
> Host: example.com
*
* Empty reply from server
curl: (52) Empty reply from server
"Empty reply from server" je přesné znění curl pro tento stav a je to nejjasnější signál, že samotné spojení fungovalo, zatímco to, co mělo vygenerovat odpověď, to neudělalo.
Co způsobuje ERR_EMPTY_RESPONSE
- Worker proces spadl při zpracovávání požadavku. Neošetřená výjimka, zabití kvůli nedostatku paměti, nebo segmentation fault mohou uzavřít spojení dřív, než je zapsaná jakákoli odpověď.
- Aplikaci vypršel časový limit za proxy, která se potichu uzavírá. Některé konfigurace reverzní proxy zavřou spojení s klientem bez odeslání chybové stránky, když backend trvá příliš dlouho, místo aby vrátily řádnou 502 nebo 504.
- Na portu pro HTTPS se obsluhuje obyčejné HTTP, nebo naopak. Klient mluvící TLS na portu obsluhujícím obyčejné HTTP, nebo naopak, nedostane žádnou platnou odpověď, kterou by protokolová vrstva klienta dokázala zpracovat, a často se to projeví jako prázdná odpověď místo jasné chyby protokolu.
- Rozšíření prohlížeče nebo lokální proxy zasahují do odpovědi. Blokátory reklam, rozšíření na ochranu soukromí, nebo firemní proxy, která odpověď kontroluje a občas špatně zpracuje, ji mohou ořezat na nic.
- Kontrola zdraví load balanceru označí backend uprostřed požadavku za nefunkční, čímž uzavře spojení k danému backendu dřív, než se odpověď dokončí.
Jak zjistit, čí je to chyba
Nejdřív vypněte rozšíření prohlížeče nebo zkuste anonymní okno; rozšíření na straně klienta je jedna z běžnějších a snáz vyloučitelných příčin. Pokud prázdná odpověď přetrvává i s vypnutými rozšířeními, otestujte to z druhého zařízení nebo sítě, abyste vyloučili lokální proxy. Pokud se to konzistentně děje z více vnějších míst, příčinou je server nebo pád aplikace. Spuštění HTTP kontroly z několika kontrolních bodů najednou potvrdí, jestli je prázdná odpověď univerzální, nebo vázaná na jednoho klienta, rozšíření nebo síť.
Jak opravit ERR_EMPTY_RESPONSE
Pokud jste návštěvník
- Zkuste anonymní okno s vypnutými rozšířeními, abyste vyloučili blokátor reklam nebo rozšíření na ochranu soukromí zasahující do odpovědi.
- Vypněte jakoukoli lokální proxy nebo VPN a zkuste to znovu, protože některé odpovědi zachytávají a občas je místo předání špatně zpracují.
- Vymažte cache prohlížeče pro daný web; cachovaný, poškozený stav spojení se občas může při opakování projevit jako tahle chyba.
- Počkejte a stránku znovu načtěte. Pokud je příčinou spadlý worker proces na serveru, supervizor procesů ho typicky restartuje během několika vteřin.
Pokud web provozujete
- Zkontrolujte logy aplikace kvůli pádu ve stejném čase jako selhaný požadavek; neošetřená výjimka nebo zabití kvůli nedostatku paměti je nejčastější příčina a obvykle po sobě zanechá jasnou stopu.
- Ověřte, že je ke každému portu navázaný správný protokol. Přímou kontrolou ověřte, že port 443 skutečně obsluhuje TLS a port 80 obyčejné HTTP, ne naopak:
curl -v https://example.com:443/ curl -v http://example.com:80/ - Projděte chování timeoutu reverzní proxy. Na nginx by backend, který překročí
proxy_read_timeout, měl pořád vrátit 504, takže prázdná odpověď místo řádné chybové stránky obvykle znamená, že spojení uzavírá něco níž v zásobníku. - Zkontrolujte logy load balanceru a kontroly zdraví kvůli backendu označenému za nefunkční v čase selhání, což může uzavřít probíhající spojení k dané instanci.
- Restartujte postižený worker nebo službu, pokud se pád potvrdí, a po restartu pozorně sledujte logy, jestli se stejná chyba nezopakuje.
Jak předejít ERR_EMPTY_RESPONSE
Pád workeru za specifických podmínek, jako je konkrétní obsah požadavku nebo špička spotřeby paměti, může být natolik přerušovaný, že projde ruční kontrolou, zatímco skutečným návštěvníkům pravidelně selhává. Průběžný HTTP monitoring, který v pravidelném intervalu z více než 300 kontrolních bodů ve 158 městech kontroluje stavový kód i tělo odpovědi, zachytí vzor prázdných odpovědí, který by jednorázová ruční kontrola pravděpodobně přehlédla, s upozorněními e-mailem, SMS, hlasovým hovorem, přes Slack, Telegram a další.
Související chyby
- ERR_CONNECTION_RESET taky předčasně ukončí fungující spojení, ale výslovným resetem, ne tichým uzavřením.
- 502 Bad Gateway je řádná HTTP chybová odpověď od proxy, na rozdíl od prázdné odpovědi, kterou popisuje tahle chyba.
- This site can't be reached pokrývá celou sadu chyb spojení, které Chrome řadí pod jeden nadpis.
Často kladené otázky
Je ERR_EMPTY_RESPONSE totéž jako chyba 502?
Ne. 502 je kompletní HTTP odpověď se status řádkou, hlavičkami a obvykle i tělem, kterou záměrně pošle proxy. ERR_EMPTY_RESPONSE znamená, že se neposlala žádná HTTP odpověď vůbec, jen uzavřené spojení.
Proč se tohle stává jen na jedné konkrétní stránce?
Stránka, která tuhle chybu konzistentně spouští, zatímco jiné se v pořádku načítají, obvykle ukazuje na pád v cestě kódu, kterou používá zrovna ta stránka nebo endpoint API, ne na obecný problém serveru nebo sítě.
Může tuhle chybu skutečně způsobit blokátor reklam?
Ano. Některé blokátory reklam a rozšíření na ochranu soukromí zachytávají a přepisují odpovědi, a chyba nebo agresivní pravidlo mohou legitimní odpověď občas ořezat na nic, místo aby ji čistě zablokovaly.
Znamená ERR_EMPTY_RESPONSE, že se ztratila moje data?
U požadavku GET ne nutně, ale u odeslání formuláře nebo volání API, které mění data, zkontrolujte, jestli se akce na serveru skutečně dokončila, než to zkusíte znovu, protože klient z prázdné odpovědi nepozná, jestli byl požadavek zpracovaný.
Proč curl místo chybového kódu píše "Empty reply from server"?
Protože neexistuje žádná HTTP odpověď, ze které by se dal přečíst stavový kód. Vlastní znění curl popisuje událost na transportní úrovni, uzavřené spojení bez dat, což je o vrstvu níž než samotný protokol HTTP.
Mohla by spojení uzavírat moje vlastní síť místo serveru?
Je to méně časté než příčina na straně serveru, ale stává se to. Firemní proxy nebo firewall, který ukončuje dlouho běžící spojení po pevné době nečinnosti, může vyprodukovat stejný příznak; otestování stejného požadavku z jiné sítě to rychle vyloučí.