← Назад к вопросам

Приведи пример работы с ошибкой 504

1.6 Junior🔥 131 комментариев
#Тестирование API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разбор ошибки 504 Gateway Timeout

Ошибка 504 Gateway Timeout — это код состояния HTTP, который указывает, что один сервер в цепочке (чаще всего шлюз или прокси-сервер) не получил своевременного ответа от вышестоящего сервера, к которому он обращался. Это критическая ошибка на уровне инфраструктуры, а не приложения, и она напрямую связана с проблемами таймаутов и производительности.

Сценарий возникновения ошибки 504

Представьте архитектуру, где пользовательский запрос проходит через несколько узлов:

  1. КлиентCDN/Прокси-сервер (Nginx)Сервер приложения (Backend)Внешний микросервис или API.

Если сервер приложения (Backend) выполняет долгий запрос к внешнему API (например, формирует сложный отчёт), а прокси-сервер (Nginx) настроен на ожидание ответа в течение 30 секунд (timeout), то по истечении этого времени прокси-сервер вернёт клиенту ошибку 504, даже если Backend и внешний API в итоге успешно обменяются данными.

Практический пример: Воспроизведение и анализ

Допустим, мы тестируем функцию "Экспорт данных" в веб-приложении, которая делает тяжёлый запрос к внешнему сервису аналитики.

Шаг 1. Воспроизведение

Мы инициируем экспорт большого объёма данных. В логах Nginx (/var/log/nginx/error.log) может появиться запись:

2023-10-26 15:30:00 [error] 12345#12345: *789100 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.1.1, server: example.com, request: "POST /api/export HTTP/1.1", upstream: "http://backend-app:8080/api/export", host: "example.com"

Шаг 2. Анализ с помощью инструментов

Мы используем curl с увеличением таймаута, чтобы проверить, является ли проблема исключительно в настройках прокси.

# Прямой запрос к бэкенду, минуя прокси (если доступно)
curl --max-time 60 http://backend-app:8080/api/export

# Или запрос через прокси с увеличенным таймаутом
curl --max-time 60 https://example.com/api/export

Если прямой запрос к бэкенду завершается успешно дольше, чем за 30 секунд, то корень проблемы — в несовпадении таймаутов между серверами.

Шаг 3. Изучение конфигурации

Проверяем конфигурацию Nginx. Ключевые директивы:

  • proxy_read_timeout — время ожидания ответа от upstream-сервера.
  • proxy_connect_timeout — время на установку соединения.
location /api/ {
    proxy_pass http://backend-app:8080;
    proxy_read_timeout 30s;  # Значение по умолчанию, которого может не хватать
    proxy_connect_timeout 5s;
}

Стратегия исправления и предотвращения

  1. Корректировка таймаутов инфраструктуры (временное или постоянное решение):
    # Увеличиваем таймаут для конкретного долгого эндпоинта
    location /api/export {
        proxy_pass http://backend-app:8080;
        proxy_read_timeout 300s; # 5 минут
    }
    
    *Важно:* Слишком большие таймауты могут исчерпать ресурсы сервера (worker connections).

  1. Оптимизация Backend-логики (основное решение):
    *   Перевести долгие операции в **асинхронный режим**: запрос принимается, операция ставится в очередь (например, RabbitMQ, Redis), а клиенту сразу возвращается `202 Accepted` с ID задачи. Результат запрашивается позже отдельным запросом или отправляется по webhook.
    *   Реализовать **пагинацию** или **постепенную потоковую передачу** (streaming) данных.
    *   Оптимизировать запросы к БД и внешним API, добавить кэширование.

  1. Внедрение мониторинга и алертинга:
    *   Настроить алерты в **Prometheus/Grafana** на увеличение 99-го перцентиля времени ответа upstream-серверов.
    *   Мониторить логи ошибок Nginx с помощью **ELK-стека** или **Loki**.

  1. Рекомендации для разработки и тестирования:
    *   В техническом задании (ТЗ) для API обязательно указывать **SLA по времени ответа** для эндпоинтов.
    *   Включать в **нагрузочное тестирование** (JMeter, k6) сценарии с длительными операциями, чтобы проверить поведение системы и цепочки таймаутов под нагрузкой.
    *   Добавить в код приложения **контрольные точки логирования** времени выполнения каждого этапа долгой операции для упрощения последующей диагностики.

Вывод для QA-инженера: Ошибка 504 — это "симптом", который указывает на разрыв в SLA между звеньями цепочки обработки запроса. Задача QA не только в том, чтобы зафиксировать факт ошибки, но и помочь локализовать проблемное звено (прокси, бэкенд, внешний сервис), проанализировать логи и конфигурации, а также предложить или протестировать решения: от настройки инфраструктуры до архитектурных изменений в приложении.

Приведи пример работы с ошибкой 504 | PrepBro