Помилка Cloudflare 520: що означає і як виправити
Помилка Cloudflare 520 означає, що Cloudflare з'єднався з вашим origin-сервером, але отримав у відповідь щось порожнє, нерозпізнаване чи інакше надто зіпсоване, щоб передати відвідувачу. Cloudflare використовує код 520 як загальний контейнер для всього: щось від origin-сервера прийшло, але це щось не відповідає правилам звичайної HTTP-відповіді.
Що означає помилка 520
Cloudflare стоїть між відвідувачем і вашим вебсервером як зворотний проксі. Для звичайного запиту він відкриває TCP-з'єднання з вашим origin-сервером, надсилає запит і передає далі будь-яку HTTP-відповідь, що приходить. Помилка 520 виникає, коли цей останній крок провалюється: TCP-з'єднання встановлюється успішно, але наступні байти не парсяться як валідна HTTP-відповідь, або взагалі жоден байт не приходить до того, як з'єднання закривається.
Це ставить 520 в іншу категорію порівняно з іншими кодами 5xx від Cloudflare. Помилка 521 означає, що origin-сервер одразу відмовив у з'єднанні. Помилка 522 означає, що спроба з'єднання завершилася тайм-аутом. Помилка 520 означає, що origin-сервер щось сказав, а Cloudflare не зміг у цьому розібратися чи передати це далі.
Як з'являється помилка 520
У браузері Cloudflare показує власну сторінку помилки, "Error 520: web server returned an unknown error", разом з Ray ID, який знадобиться, якщо звертатиметеся в підтримку Cloudflare. Звичайний запит curl до домену показує той самий код статусу:
curl -I https://example.com
HTTP/2 520
На боці Cloudflare вкладки Security чи Analytics у панелі керування показують сплеск відповідей 5xx, а Enterprise-акаунти з доступом до Logpull чи Logpush можуть витягти конкретний edge-вузол і Ray ID для кожного невдалого запиту. Але жодна з цих даних не показує, що саме надіслав origin-сервер, тож наступне місце для пошуку - ваш власний сервер.
На origin-сервері перевірте логи вебсервера й застосунку на той самий часовий проміжок, коли трапилися збої. Шукайте перезапуск процесу, помилку сегментації, вбивство через нестачу пам'яті в системному лозі (dmesg чи journalctl -k), або помилку застосунку, яка обірвала запит посеред відповіді. Якщо логи застосунку взагалі не показують нічого незвичного, проблема, найімовірніше, у відповіді, що технічно завершилася, але порушила якесь HTTP-правило, наприклад завеликий заголовок.
Що спричиняє помилку 520
- Процес origin-сервера впав чи перезапустився під час обробки запиту. З'єднання закривається до того, як пішла повна відповідь. Це найпоширеніша причина.
- Origin-сервер скинув TCP-з'єднання (RST) замість того, щоб закрити його коректно. Сервери застосунків під тиском пам'яті чи з тайм-аутом воркера часто так роблять.
- Заголовки відповіді перевищують ліміт Cloudflare у 16 КБ. Великий заголовок set-cookie, стос заголовків для налагодження чи багатослівні заголовки CORS можуть перевищити загальний ліміт, який прийме Cloudflare.
- Кукі чи об'єднаний заголовок кукі завеликий. Дані сесії, трекінгові кукі чи неправильно налаштоване сховище кукі можуть з часом перерости ліміти браузера й проксі.
- Відсутній чи неправильно сформований рядок статусу. Деякі фреймворки повертають сирий рядок помилки замість належної HTTP-відповіді, коли необроблений виняток доходить до рівня вебсервера.
- Origin-сервер повернув не-HTTP дані на HTTP(S)-порту. Так буває після неправильно налаштованого зворотного проксі, неправильного відображення портів чи служби, що займає порт раніше за справжній вебсервер.
- Захисний пристрій чи WAF перед origin-сервером обірвав з'єднання посеред відповіді. Деякі локальні WAF і балансувальники навантаження завершують з'єднання, що спрацьовує на правило, і з боку Cloudflare це виглядає точнісінько як збій.
Як зрозуміти, хто винен
Оскільки Cloudflare таки отримав відповідь від origin-сервера, помилка 520 - сильний сигнал, що проблема на боці origin-сервера, а не в мережі Cloudflare, на відміну від помилки 521 чи 522, де провалилося саме з'єднання. Відкрите питання зазвичай у тому, чи це зачіпає кожного відвідувача, чи лише декого.
Найшвидший спосіб це з'ясувати - запустити HTTP-перевірку з кількох локацій одночасно. Якщо перевірка публічного домену провалюється з кожної локації в той самий час, коли про помилку повідомляють користувачі, origin-сервер справді лежить чи падає для всіх, а не лише для одного edge-дата-центру. Якщо збій трапляється лише періодично чи з певних регіонів, origin-сервер може бути перевантажений трафіком саме з цього регіону, або задіяний шар кешування чи балансування навантаження, що присутній лише в частині вашої інфраструктури. HTTP-перевірка HostTracker виконується з контрольних точок у кількох країнах і повідомляє результат кожної окремо - деталь, яку не дасть один curl з вашого власного столу.
Ви також можете повністю ізолювати origin-сервер від Cloudflare, звернувшись до нього напряму із заголовком Host домену, оминаючи edge-мережу, тож будь-яка помилка, яку ви побачите, буде безсумнівно від origin-сервера:
curl -v -H "Host: example.com" https://ORIGIN_IP/
Замініть ORIGIN_IP на справжню IP-адресу вашого сервера. Якщо цей прямий запит теж провалюється чи повертає ту саму зіпсовану відповідь, проблема на origin-сервері підтверджена.
Як виправити помилку 520
Якщо ви відвідувач
- Перезавантажте сторінку через хвилину-другу. Багато помилок 520 спричинені короткочасним збоєм чи перезапуском, з якого власний наглядач за процесами сайту відновлюється автоматично.
- Спробуйте вікно приватного перегляду чи іншу мережу. Це виключає застарілий локальний кеш чи розширення браузера, що поводиться неправильно, хоча 520 рідко спричинена чимось на вашому боці.
- Перевірте, чи публікує сайт власну сторінку статусу, якщо вона є, на предмет відомого збою.
- На вашому боці немає нічого, що можна налаштувати, щоб виправити 520. Її генерує власний сервер сайту, а не ваш браузер, провайдер чи DNS-резолвер.
Якщо ви керуєте сайтом
- Перевірте логи вебсервера й застосунку на origin-сервері за точний час збоїв, шукаючи збій, необроблений виняток чи перезапуск воркера.
- Оминіть Cloudflare і зверніться до origin-сервера напряму із заголовком Host (показано вище), або скористайтеся опцією Cloudflare "Pause Cloudflare on Site", щоб підтвердити, що відповідь зіпсована незалежно від проксі.
- Виміряйте розмір заголовків відповіді та кукі. Один великий заголовок set-cookie чи купа заголовків для налагодження, залишених у продакшені, можуть підняти загальний розмір понад 16 КБ; приберіть зайве й перенесіть великі дані сесії на бік сервера.
- Перевірте на зіпсовані відповіді: зворотний проксі чи балансувальник навантаження, спрямований не на той upstream, застосунок, що повертає простий текст на HTTP-порту, або відсутній рядок статусу від типового обробника помилок фреймворку.
- Перевірте на вичерпання ресурсів на origin-сервері: ліміти пам'яті, ліміти пулу з'єднань, чи менеджер процесів (systemd, pm2, пул воркерів Gunicorn чи uWSGI), що застряг у циклі перезапуску.
- Якщо між інтернетом і вашим сервером застосунку стоїть WAF, антивірусний проксі чи балансувальник навантаження, перевірте його власні логи на предмет з'єднань, які він скинув чи обірвав приблизно в той самий час.
Як запобігти цьому
Помилка 520 зазвичай спершу з'являється як звернення в підтримку, а не як сповіщення, бо ніщо на origin-сервері обов'язково не логує невдале рукостискання з edge-вузлом Cloudflare так, як логує виняток застосунку. Зовнішня перевірка доступності, що виконується поза вашою власною мережею, ловить той самий збій, який бачить відвідувач, з тієї самої точки зору, ще до того, як комусь довелося про це повідомити. Запуск перевірки з кількох країн також одразу показує, чи 520 глобальна, чи обмежена одним регіоном - деталь, яка визначає, з чого починати діагностику.
Пов'язані помилки
- Помилка Cloudflare 521: вебсервер недоступний - origin-сервер відмовив у з'єднанні замість того, щоб відповісти.
- Помилка Cloudflare 522: тайм-аут з'єднання - TCP-рукостискання з origin-сервером так і не завершилося.
- Помилки сервера 5xx - загальна родина кодів статусу.
- 502 Bad Gateway - версія невалідної відповіді upstream, не специфічна для Cloudflare.
Часті запитання
Помилка 520 - вина Cloudflare чи моя?
Майже завжди origin-сервера. Cloudflare отримав відповідь і не зміг у ній розібратися чи передати її далі, а це означає, що зіпсовану відповідь створив саме сервер origin, а не мережа Cloudflare.
Чи означає помилка 520, що весь мій сайт лежить?
Не обов'язково. Вона означає, що провалився конкретний запит, який її викликав. Якщо origin-сервер падає під навантаженням, він може віддавати 520 деяким запитам і нормальні відповіді іншим, поки основну проблему не виправлять.
Чи можу я виправити помилку 520 лише з панелі керування Cloudflare?
Рідко. Оскільки причина майже завжди на origin-сервері, налаштування панелі не виправлять застосунок, що падає, чи завеликий заголовок відповіді. Виняток - перевірка, що ваш режим SSL/TLS і налаштування origin-сервера збігаються з тим, що сервер справді робить, - це принаймні виключає неправильну конфігурацію на боці Cloudflare.
Яка різниця між помилкою 520 і звичайним 502 Bad Gateway?
502 - загальний HTTP-статус для невалідної відповіді від upstream-сервера, який використовує будь-який зворотний проксі. Cloudflare використовує 520 спеціально як власний загальний контейнер для відповіді, настільки зіпсованої, що вона не підходить під жоден інший названий код 5xx у Cloudflare, тому й з'являється сторінка помилки Cloudflare з Ray ID замість типової сторінки 502.
Чи справді велика кукі може спричинити 520?
Так. Cloudflare застосовує ліміт на загальний розмір заголовків відповіді, зараз близько 16 КБ, і кукі враховуються в цей ліміт. Застосунок, який постійно дописує до кукі сесії, або встановлює одразу кілька великих кукі, може перевищити цей ліміт і спричинити 520 навіть тоді, коли в самому застосунку немає жодного бага.
Чи допоможе повторний запит?
Іноді, якщо причиною був тимчасовий збій чи перезапуск на origin-сервері, який уже відновився. Якщо origin-сервер стабільно надсилає зіпсовані відповіді, наприклад через завеликий заголовок у кожному запиті, повторна спроба не допоможе, доки origin-сервер не виправлять.