Что это значит

nginx передал запрос сервису и не дождался ответа за proxy_read_timeout (по умолчанию 60 секунд). Пользователь получает 504. Сервис при этом мог продолжить работу и даже успешно закончить операцию, просто ответ уже некому отдать.

Это следствие, а причина в том, что операция идёт слишком долго: тяжёлый отчёт, массовое действие, ожидание блокировки в базе, перегруженный сервис.

Как проверить

Строка лога nginx содержит адрес запроса и адрес сервиса (upstream: "http://..."). По ним видно, какая операция и какой сервис.

grep "upstream timed out" /var/log/nginx/error.log | awk -F'request: ' '{print $2}' | sort | uniq -c | sort -rn | head

Затем посмотрите в это же время долгие запросы и блокировки в базе и загрузку сервиса.

Что сделать

  1. Одни и те же адреса: это конкретная тяжёлая операция, разбирать нужно её.
  2. Разные адреса в одно время: сервис или база были перегружены. Смотреть память, процессор, блокировки.
  3. Для заведомо долгих операций (выгрузки, отчёты) поднять proxy_read_timeout и proxy_send_timeout на нужном location. Не поднимать глобально: это прячет проблему и держит соединения.
  4. В ingress-nginx: аннотации proxy-read-timeout и proxy-send-timeout.