Сервис не ответил веб-серверу вовремя (504)
upstream timed out 110 Connection timed out while reading response header from upstream, ошибка 504 Gateway Timeout в Directum RX: сервис обрабатывает запрос дольше, чем ждёт nginx.
Что это значит
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
Затем посмотрите в это же время долгие запросы и блокировки в базе и загрузку сервиса.
Что сделать
- Одни и те же адреса: это конкретная тяжёлая операция, разбирать нужно её.
- Разные адреса в одно время: сервис или база были перегружены. Смотреть память, процессор, блокировки.
- Для заведомо долгих операций (выгрузки, отчёты) поднять
proxy_read_timeoutиproxy_send_timeoutна нужномlocation. Не поднимать глобально: это прячет проблему и держит соединения. - В ingress-nginx: аннотации
proxy-read-timeoutиproxy-send-timeout.