Статус коды: ошибки сервера (5xx)
Введение: авария на кухне 🔧
5xx — это сигнал: запрос правильный, но сервер не справился.
Клиент здесь не виноват — проблема на стороне системы.
Клиент здесь не виноват — проблема на стороне системы.
💡 Совет: 5xx — повод проверить логи, а не клиента.
✅ Вывод: 5xx = «проблема у сервера».
✅ Вывод: 5xx = «проблема у сервера».
Проблема → решение
Проблема: если всегда отдавать 500, никто не понимает, где сбой.
Решение: различать типы ошибок: инфраструктура, шлюз, таймауты.
Решение: различать типы ошибок: инфраструктура, шлюз, таймауты.
✅ Вывод: правильный 5xx ускоряет диагностику.
Чем помогает и как работает
5xx‑коды показывают, что проблема на стороне сервера, а не клиента.
Это помогает понять, что запрос нужно повторить или эскалировать.
Как это работает:
- Сервер получает запрос, но внутри происходит сбой.
- Возвращает 5xx и пишет ошибку в логи.
- Клиент может повторить запрос или показать сообщение.
✅ Вывод: 5xx отделяют серверные сбои от ошибок клиента.
Ключевые термины (простыми словами)
- 5xx — ошибки сервера.
- Gateway (шлюз) — сервис‑посредник между клиентом и сервером.
- Timeout — сервер не дождался ответа.
- Retry — повторный запрос.
- Correlation ID — идентификатор запроса в логах.
✅ Вывод: термины помогают искать корень проблем.
Самое важное (must‑know)
- 500 — ошибка приложения (баг), не «что-то пошло не так».
- 502 vs 504: 502 — плохой ответ от upstream, 504 — таймаут.
- 503 = временная недоступность, и нужен Retry-After.
- Correlation ID в логах обязателен для расследований.
- Не прячьте ошибки под 200 — это ломает клиентов и мониторинг.
✅ Вывод: эти правила — основа правильной эксплуатации API.
1. 500 Internal Server Error
Назначение: общая ошибка сервера.
Простыми словами: сервер сломался из‑за внутренней ошибки.
Аналогия: на кухне сломалась плита.
Простыми словами: сервер сломался из‑за внутренней ошибки.
Аналогия: на кухне сломалась плита.
Пример:
HTTP/1.1 500 Internal Server Error🔎 Как это происходит на практике:
- Клиент отправляет
POST /orders. - Внутри приложения падает ошибка (исключение).
- Сервер возвращает
500и пишет ошибку в лог с correlation ID.
Когда использовать: непредвиденный сбой, ошибка в коде.
✅ Вывод: 500 = «сервер сломался».
✅ Вывод: 500 = «сервер сломался».
2. 502 Bad Gateway
Назначение: шлюз получил плохой ответ от сервиса.
Простыми словами: ответ есть, но он «сломанный» или неподдерживаемый (не тот формат, битый документ, неверные заголовки).
Аналогия: официант не получил заказ от кухни.
Простыми словами: ответ есть, но он «сломанный» или неподдерживаемый (не тот формат, битый документ, неверные заголовки).
Аналогия: официант не получил заказ от кухни.
Пример:
HTTP/1.1 502 Bad Gateway🔎 Как это происходит на практике:
- Клиент обращается к API‑шлюзу
GET /payments. - Шлюз получает от upstream битый или невалидный ответ.
- Шлюз возвращает
502 Bad Gatewayклиенту.
Когда использовать: API‑шлюз, прокси, балансировщик.
✅ Вывод: 502 = «проблема у upstream».
✅ Вывод: 502 = «проблема у upstream».
3. 503 Service Unavailable
Назначение: сервис временно недоступен.
Простыми словами: сервер перегружен или на обслуживании, нужно подождать.
Аналогия: ресторан закрыт на уборку.
Простыми словами: сервер перегружен или на обслуживании, нужно подождать.
Аналогия: ресторан закрыт на уборку.
Пример:
HTTP/1.1 503 Service UnavailableRetry-After: 120🔎 Как это происходит на практике:
- Сервис перегружен или на обслуживании.
- Отдаёт
503иRetry-After: 120. - Клиент ждёт и повторяет запрос.
Когда использовать: перегрузка, maintenance. Retry-After обязателен.
✅ Вывод: 503 = «попробуйте позже».
✅ Вывод: 503 = «попробуйте позже».
4. 504 Gateway Timeout
Назначение: шлюз не дождался ответа.
Простыми словами: запрос ушёл в сервис, но тот не ответил вовремя.
Аналогия: официант не дождался блюда.
Простыми словами: запрос ушёл в сервис, но тот не ответил вовремя.
Аналогия: официант не дождался блюда.
Пример:
HTTP/1.1 504 Gateway Timeout🔎 Как это происходит на практике:
- Клиент отправляет запрос через шлюз.
- Upstream не отвечает вовремя.
- Шлюз возвращает
504 Gateway Timeout.
Когда использовать: долгие операции, таймауты.
✅ Вывод: 504 = «время ожидания истекло».
✅ Вывод: 504 = «время ожидания истекло».
5. 507 Insufficient Storage
Назначение: на сервере не хватает места.
Простыми словами: сервер не может записать данные из‑за заполненного диска.
Аналогия: склад переполнен.
Простыми словами: сервер не может записать данные из‑за заполненного диска.
Аналогия: склад переполнен.
Пример:
HTTP/1.1 507 Insufficient Storage🔎 Как это происходит на практике:
- Клиент загружает файл или создаёт ресурс.
- Сервер не может записать данные (диск переполнен).
- Возвращает
507 Insufficient Storage.
Когда использовать: переполнение хранилища.
✅ Вывод: 507 = «нет места».
✅ Вывод: 507 = «нет места».
Таблица 5xx
| Код | Смысл | Когда использовать |
|---|---|---|
| 500 | общий сбой | ошибка в коде |
| 502 | плохой шлюз | сбой upstream |
| 503 | сервис недоступен | перегрузка/maintenance |
| 504 | таймаут | сервис не ответил |
| 507 | нет места | заполнен диск |
Часто спрашивают на собеседованиях
-
500 vs 503? 500 — неожиданная ошибка, 503 — временная недоступность.
-
502 vs 504? 502 — плохой ответ, 504 — таймаут.
-
Нужно ли ретраить 5xx? да, но с лимитом и backoff.
-
Зачем correlation ID? искать ошибку в логах.
-
Когда использовать 503 и зачем Retry-After? 503 при перегрузке/maintenance, Retry-After подсказывает, когда повторить запрос.
-
Когда возвращать 507? когда сервер не может записать данные из-за переполненного хранилища.
-
Почему нельзя отдавать 200 при ошибке? это ломает клиентов и мониторинг, правильно вернуть 5xx. ✅ Вывод: понимание 5xx = грамотная эксплуатация API.
Типичные ошибки
Ошибка 1: всегда 500
❌ все сбои = 500
✅ различайте 502/503/504
Почему: иначе трудно диагностировать.
✅ различайте 502/503/504
Почему: иначе трудно диагностировать.
Ошибка 2: нет Retry-After
❌ клиент не знает, когда повторить
✅ добавляйте Retry-After для 503
Почему: это помогает клиентам.
✅ добавляйте Retry-After для 503
Почему: это помогает клиентам.
Ошибка 3: скрывать ошибку
❌ 200 OK с полем error
✅ корректный 5xx
Почему: статус должен говорить правду.
✅ корректный 5xx
Почему: статус должен говорить правду.
Best Practices
- Логируйте 5xx с correlation ID.
- Добавляйте Retry-After для 503.
- Разделяйте 502/504 для шлюза.
- Не прячьте ошибки под 200.
Заключение
🎯 5xx — это сбой на сервере.
🎯 Точный код ускоряет расследование.
🎯 Клиент должен понимать, когда повторять запрос.
🎯 Точный код ускоряет расследование.
🎯 Клиент должен понимать, когда повторять запрос.
Теперь вы понимаете, как управлять серверными ошибками.