#Что означает и когда возникает ошибка
Текст журнала после while помогает отличить тайм-аут подключения, ожидания заголовка или чтения тела. Для долгой операции предпочтительнее исправить приложение или использовать очередь, а не просто выставить много минут ожидания.
#Причины и как их различить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| API выполняет медленный запросОдна операция ждёт базу, внешнюю службу или блокировку. | Тайм-аут только у конкретного метода/пути, время до сбоя повторяется. | Замерить длительность на приложении и оптимизировать. |
У API отдельные директивы NginxУ location /api/ другой proxy_read_timeout или upstream. | Обычные страницы открываются, а GET/POST к API зависают. | Сравнить выбранный location и конфигурацию proxy_pass. |
| Доступен прокси, но недоступен backendУ приложения перегружен пул, нет свободных работников или не открывается порт. | Логи API сообщают об отказах, очередь растёт; Nginx пишет timed out при connect/read. | Восстановить работоспособность приложения, не открывая внутренний порт в интернет. |
#Пошаговая диагностика и исправление
- Повторите только безопасный API-запросОпределите конкретный endpoint и метод (GET, POST и т. д.). Для GET без побочных действий с вашего компьютера выполните
curl -sS -o /dev/null -w "HTTP:%{http_code} total:%{time_total} first_byte:%{time_starttransfer}\n" https://example.com/api/status, заменив URL. Если метод изменяет данные, не повторяйте его вслепую: используйте тестовую среду и согласованный тестовый запрос. Запишите время и статус. - Прочитайте точную стадию тайм-аутаПодключитесь по SSH и посмотрите журнал Nginx по адресу из
error_logфактической конфигурации. Найдитеupstream timed outза время запроса и запишите, что следует послеwhile: connecting to upstream, reading response header или reading upstream. Не публикуйте токены и параметры частных API. Если сообщения нет, проверьте журнал CDN либо внешнего балансировщика. - Проверьте выбор location /api/ и проксиКомандой
sudo nginx -T 2>&1 | grep -nE "location|proxy_pass|proxy_(connect|read|send)_timeout|upstream"найдите правила домена. Сопоставьте выбранныйlocationи реально проксируемый адрес с рабочим URL; обратите внимание на косую черту в концеproxy_pass, способную изменить передаваемый путь. Не редактируйте конфигурацию на основании одного совпадения grep — прочитайте соседние строки полного файла. - Проверьте приложение локально безопасным запросомЕсли API слушает локальный TCP-порт, выполните на сервере тестовый GET к проверенному безопасному пути непосредственно на
127.0.0.1и нужный порт, используяcurl. Порт надо взять из своей настройкиproxy_pass, не подставлять случайный. Если приложение использует Unix-сокет или авторизацию, используйте штатный health-check приложения и его журнал; не открывайте внутренний порт публично для диагностики. - Найдите истинную задержкуСравните время первого байта у Nginx и время выполнения в журнале приложения. Если ответ упирается в SQL, блокировки, медленный внешний API или очередь задач, оптимизируйте этот участок. Проверьте рабочие процессы, память и ошибки приложения. Увеличение
proxy_read_timeoutне исправит бесконечно зависший запрос: это интервал без передачи данных между чтениями, а не универсальный предел всей операции. - Правьте тайм-аут только после подтвержденияЕсли API действительно должен законно отвечать дольше и все промежуточные уровни это поддерживают, сохраните копию файла, задайте для конкретного
locationобоснованное значениеproxy_read_timeout 90s;(90s лишь пример) и выполнитеsudo nginx -t. Применяйтеsudo systemctl reload nginxтолько после успешного теста. Убедитесь, что внешний балансировщик и клиент не обрывают запрос раньше. - Проверьте отказоустойчивость и откатПовторите исходный безопасный запрос, сравните HTTP-статус, время ответа и отсутствие новых timed out в журнале. Если после настройки выросли очереди и 502/504, верните сохранённый файл, проверьте
nginx -t, примените конфигурацию и исследуйте приложение. Для долгих отчётов и импорта используйте фоновые задачи с проверкой состояния. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Проверка результата
Успех: целевой API возвращает ожидаемый код и содержимое, время ответа стабильно, новых сообщений timed out для этого пути нет.
#Если проблема осталась
Сохраните дату, точный URL без паролей и токенов, код ответа, обезличенные строки error.log и access.log за это время и перечень уже сделанных изменений. Сравните работу при обращении через публичный адрес и через внутренний балансировщик, если он есть. Если причину пока не удалось подтвердить, восстановите исходную конфигурацию из копии и передайте эти сведения администратору или разработчику приложения; не меняйте несколько параметров одновременно.