Все посты

Страница ошибки — это продуктовая поверхность, а не debug-экран

25 мая 2026 г.4 мин чтенияKB Labs
Share

В три часа ночи прод лёг на четыре минуты. Gateway вернул дефолтную nginx-страницу — «502 Bad Gateway» белым на чёрном, ни логотипа, ничего. Кто-то снял скриншот и запостил: «продакшн KB Labs, очень солидно».

К утру починили. Но скриншот уже посмотрели 1200 человек.

500-страница — это не косметика, которую «сделаем потом». Это последнее, что человек видит перед тем как закрыть вкладку. И, возможно, перед тем как написать что-нибудь про тебя публично.

Кто вообще попадает на 5xx

Подумай кто это может быть:

  • Пользователь, который только что что-то нажал и не дождался ответа.
  • Клиент с дедлайном через час, который выгружает данные через твой API.
  • Журналист, который впервые зашёл на сайт по ссылке из твита.
  • Инженер, который прямо сейчас решает — рекомендовать ли вас команде.

Все они в этот момент в одном клике от того, чтобы уйти. Если вместо нормальной страницы они видят «Internal Server Error 500» с дефолтным nginx-экраном — сигнал один: «тут об этом не думали».

И они уходят.

Что должно быть

Не нужно делать арт. Нужно чтобы было видно — ты об этом моменте думал.

Бренд. Логотип, цвета, шрифт. Человек должен понять, что это твой сайт упал, а не интернет.

Нормальный текст. Не Internal Server Error 500. Что-то вроде:

Что-то сломалось на нашей стороне. Уже знаем, чиним. Попробуй через минуту.

Без жаргона. Если знаешь что конкретно упало — скажи прямо.

Request ID. Короткий идентификатор, который можно скопировать и прислать в поддержку. Превращает «ничего не могу сделать» в «вот мой ID, помогите». Пользователь перестаёт чувствовать себя жертвой.

Чего не должно быть. Stack trace, имена фреймворков, заголовки X-Powered-By. Это security-риск и просто «мы не контролируем, что отдаём».

Для API-клиентов. Если в запросе Accept: application/json — верни JSON, не HTML. HTML в JSON-парсере создаст второй баг поверх первого. Чистый JSON с теми же полями — пять строк в nginx-конфиге.

Это делается один раз

Один HTML-файл, один JSON-fallback, ~30 строк в nginx с proxy_intercept_errors on и error_page 500 502 503 504 = @handler. Всё. После этого вся инфраструктура — gateway, web, docs, всё что появится потом — автоматически отдаёт нормальную страницу при любом падении апстрима.

Один раз — и больше никогда не показывать пользователю чёрный экран с надписью 502.

Почему это легко откладывать

Не приносит фич, не двигает метрики. Легко написать в backlog и забыть.

Но каждый раз, когда прод падает, а страница ошибки — это дефолтный nginx, ты сам себе делаешь хуже в момент, когда и так плохо.

Один день работы. Потом об этом не думаешь.

Страница ошибки — это продуктовая поверхность, а не debug-экран