ERR_EMPTY_RESPONSE: причини і виправлення
ERR_EMPTY_RESPONSE означає, що з'єднання прийняли, але сервер повернув нуль байтів замість належної HTTP-відповіді чи навіть сторінки помилки. TCP-рукостискання пройшло успішно; те, що мало відповісти на запит, так і не відповіло.
Що означає ERR_EMPTY_RESPONSE
Ця помилка трапляється пізніше в життєвому циклі запиту, ніж відмова у з'єднанні чи тайм-аут. Браузер успішно з'єднується із сервером, і в HTTPS-запиті TLS-рукостискання зазвичай теж завершується, але після надсилання запиту з'єднання закривається без жодного рядка статусу HTTP, заголовків чи тіла. Це відрізняється від сторінки помилки 500 чи 502, яка все ще є повною HTTP-відповіддю; тут нічого парсити, бо нічого не прийшло.
Це робить ERR_EMPTY_RESPONSE складнішою для діагностики з боку клієнта, ніж більшість помилок з'єднання, оскільки кожен шар аж до транспортного з'єднання включно спрацював правильно. Проблема саме в тому, що генерує HTTP-відповідь: процес застосунку, фреймворк, що обробляє запит, чи проксі перед ним, що закрив сокет замість того, щоб передати далі чи згенерувати належну сторінку помилки.
Як з'являється помилка
Chrome показує "This site can't be reached ... ERR_EMPTY_RESPONSE", щойно з'єднання закривається без даних. curl повідомляє про ту саму умову прямим текстом:
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" - точне формулювання curl для цієї умови, і це найчіткіший сигнал того, що саме з'єднання спрацювало, а от те, що мало згенерувати відповідь, - ні.
Що спричиняє ERR_EMPTY_RESPONSE
- Робочий процес упав під час обробки запиту. Необроблений виняток, вбивство через нестачу пам'яті чи помилка сегментації можуть закрити з'єднання ще до того, як записано хоч якусь відповідь.
- Застосунок дав тайм-аут за проксі, що закривається мовчки. Деякі конфігурації зворотного проксі закривають клієнтське з'єднання, не надсилаючи сторінку помилки, коли бекенд надто довго відповідає, замість того, щоб повернути належні 502 чи 504.
- На HTTPS-порту віддається звичайний HTTP, чи навпаки. Клієнт, що говорить TLS до порту, який віддає звичайний HTTP, чи навпаки, не отримує валідної відповіді, яку зміг би розібрати шар протоколу клієнта, і це часто проявляється як порожня відповідь, а не чітка помилка протоколу.
- Розширення браузера чи локальний проксі втручається у відповідь. Блокувальники реклами, розширення приватності чи корпоративний проксі, що перевіряє й час від часу неправильно обробляє відповідь, можуть звести її нанівець.
- Перевірка здоров'я балансувальника навантаження позначає бекенд нездоровим посеред запиту, закриваючи з'єднання з цим бекендом до того, як відповідь завершиться.
Як зрозуміти, хто винен
Спершу вимкніть розширення браузера чи спробуйте вікно інкогніто; розширення на боці клієнта - одна з найпоширеніших і найлегших для виключення причин. Якщо порожня відповідь зберігається з вимкненими розширеннями, протестуйте з другого пристрою чи мережі, щоб виключити локальний проксі. Якщо це стабільно трапляється з кількох зовнішніх локацій, причина - сервер чи збій застосунку. Запуск HTTP-перевірки з кількох контрольних точок одночасно підтверджує, чи порожня відповідь універсальна, чи прив'язана до одного клієнта, розширення чи мережі.
Як виправити ERR_EMPTY_RESPONSE
Якщо ви відвідувач
- Спробуйте вікно інкогніто чи приватного перегляду з вимкненими розширеннями, щоб виключити блокувальник реклами чи розширення приватності, що втручається у відповідь.
- Вимкніть будь-який локальний проксі чи VPN і повторіть спробу, оскільки деякі перехоплюють і час від часу неправильно обробляють відповіді замість того, щоб передавати їх напряму.
- Очистіть кеш браузера для сайту; закешований, пошкоджений стан з'єднання може іноді проявитися саме цією помилкою при повторній спробі.
- Зачекайте і перезавантажте. Якщо причина - впалий робочий процес на сервері, наглядач за процесами зазвичай перезапускає його протягом секунд.
Якщо ви керуєте сайтом
- Перевірте логи застосунку на предмет збою в той самий момент часу, що й невдалий запит; необроблений виняток чи вбивство через нестачу пам'яті - найпоширеніша причина, і зазвичай лишає чіткий слід.
- Підтвердьте, що правильний протокол прив'язаний до кожного порту. Перевірте, що порт 443 справді віддає TLS, а порт 80 - звичайний HTTP, а не навпаки, прямою перевіркою:
curl -v https://example.com:443/ curl -v http://example.com:80/ - Перегляньте поведінку тайм-ауту зворотного проксі. На nginx бекенд, що перевищує
proxy_read_timeout, усе одно має повернути 504, тож порожня відповідь замість належної сторінки помилки зазвичай означає, що щось закриває з'єднання нижче в стеку. - Перевірте логи балансувальника навантаження й перевірки здоров'я на предмет бекенда, позначеного нездоровим приблизно в момент збою, що може закривати з'єднання, що вже виконуються, до того екземпляра.
- Перезапустіть постраждалий воркер чи службу, якщо збій підтверджено, і уважно стежте за логами після перезапуску на предмет повторення тієї самої помилки.
Як запобігти ERR_EMPTY_RESPONSE
Збій воркера за конкретних умов, наприклад певного тіла запиту чи сплеску пам'яті, може бути настільки періодичним, що проходить ручний тест, продовжуючи провалюватися для реальних відвідувачів за розкладом. Постійний HTTP-моніторинг, що перевіряє код статусу й тіло відповіді з регулярним інтервалом із понад 300 контрольних точок у 158 містах, ловить патерн порожніх відповідей, який одноразова ручна перевірка, найімовірніше, пропустить, зі сповіщеннями електронною поштою, SMS, голосовим дзвінком, у Slack, Telegram та іншими способами.
Пов'язані помилки
- ERR_CONNECTION_RESET також завершує робоче з'єднання достроково, але з явним скиданням, а не мовчазним закриттям.
- 502 Bad Gateway - це належна HTTP-відповідь про помилку від проксі, на відміну від порожньої відповіді, яку описує ця помилка.
- This site can't be reached охоплює весь набір помилок з'єднання, які Chrome об'єднує під одним заголовком.
Часті запитання
Чи ERR_EMPTY_RESPONSE - те саме, що помилка 502?
Ні. 502 - це повна HTTP-відповідь з рядком статусу, заголовками і зазвичай тілом, надіслана навмисно проксі. ERR_EMPTY_RESPONSE означає, що жодної HTTP-відповіді взагалі не надіслали, лише закрите з'єднання.
Чому це трапляється лише на одній конкретній сторінці?
Сторінка, що стабільно спричиняє цю помилку, поки інші завантажуються нормально, зазвичай вказує на збій у шляху коду, який використовує саме ця сторінка чи API-ендпоінт, а не на загальну проблему сервера чи мережі.
Чи справді блокувальник реклами може спричинити цю помилку?
Так. Деякі блокувальники реклами й розширення приватності перехоплюють і переписують відповіді, і баг чи агресивне правило можуть іноді звести легітимну відповідь нанівець замість того, щоб чисто заблокувати її.
Чи означає ERR_EMPTY_RESPONSE, що мої дані втрачено?
Не обов'язково для GET-запиту, але для відправлення форми чи виклику API, що змінює дані, перевірте, чи дія справді завершилася на сервері, перш ніж повторювати спробу, оскільки клієнт не може сказати з порожньої відповіді, чи запит було оброблено.
Чому curl каже "Empty reply from server" замість коду помилки?
Тому що немає HTTP-відповіді, з якої можна прочитати код статусу. Власне формулювання curl описує подію на транспортному рівні - закрите з'єднання без даних - на один шар нижче за сам протокол HTTP.
Чи може моя власна мережа закривати з'єднання замість сервера?
Це менш поширено, ніж причина на боці сервера, але трапляється. Корпоративний проксі чи брандмауер, що завершує довготривалі з'єднання після фіксованого періоду простою, може дати той самий симптом; тестування того самого запиту з іншої мережі швидко це виключає.