В три часа ночи прод лёг на четыре минуты. 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, ты сам себе делаешь хуже в момент, когда и так плохо.
Один день работы. Потом об этом не думаешь.