Timeout (тайм-аут) — механизм ограничения времени ожидания в сетевых и вычислительных операциях. Без тайм-аутов клиент может ждать ответ от недоступного сервера вечно, блокируя ресурсы. Тайм-ауты определяют «когда считать операцию провалившейся» и инициируют корректную обработку ошибки.
Как работает
При HTTP-запросе выделяют несколько последовательных фаз, каждая из которых имеет свой тайм-аут.
Connect timeout — максимальное время для установки TCP-соединения с сервером (3-way handshake). Если сервер недоступен или маршрут заблокирован, клиент ждёт не более заданного времени. Типичное значение: 3–10 секунд. При истечении — ошибка «Connection refused» или «Network unreachable».
Read timeout (response timeout) — максимальное время ожидания данных после установки соединения. Операция read() блокируется, пока сервер не начал отдавать данные. Если сервер принял соединение, но «завис» при обработке запроса — read timeout прерывает ожидание. Типичное значение: 30–120 секунд для API, 5–30 секунд для веб-страниц.
Write timeout — максимальное время для отправки данных запроса серверу. Применимо при загрузке больших файлов: если соединение прервалось во время отправки — write timeout определяет предел ожидания.
Idle timeout — максимальное время неактивного соединения (keep-alive соединения без данных) до его закрытия. Nginx по умолчанию — 75 секунд (keepalive_timeout). Позволяет переиспользовать TCP-соединение для нескольких HTTP-запросов.
В nginx тайм-ауты настраиваются через директивы: proxy_connect_timeout 5s (соединение с upstream), proxy_read_timeout 60s (ожидание ответа upstream), proxy_send_timeout 60s (отправка запроса upstream). Для PHP-FPM: request_terminate_timeout — максимальное время выполнения PHP-скрипта.
История
Концепция тайм-аутов появилась в ранних реализациях TCP/IP в 1970-х годах. RFC 793 (1981), определивший TCP, включает механизм Retransmission Timeout (RTO) — время повтора неподтверждённых сегментов. HTTP/1.0 (RFC 1945, 1996) не стандартизировал тайм-ауты — они оставались делом реализации. HTTP/1.1 (RFC 2616, 1999) ввёл keep-alive соединения и тем самым сделал idle timeout значимым параметром. В современных микросервисных архитектурах управление тайм-аутами (circuit breaker pattern) стало отдельной дисциплиной.
Виды тайм-аутов
- DNS timeout
- Время ожидания ответа DNS-сервера. Если превышено — retry к следующему NS-серверу. Обычно 2–5 секунд.
- SSL/TLS handshake timeout
- Максимальное время TLS-рукопожатия. При медленном соединении или перегруженном сервере может занять 1–3 секунды.
- Database query timeout
- Максимальное время выполнения SQL-запроса. Предотвращает зависание приложения из-за медленного запроса.
- Session timeout
- Максимальное время бездействия пользовательской сессии до её аннулирования. Требование безопасности.
На что обращать внимание
Тайм-ауты должны быть осмысленными: слишком короткие — приложение падает при кратковременной нагрузке, слишком длинные — пользователь ждёт неоправданно долго. Правило: connect timeout всегда короче read timeout. Для внешних API-запросов устанавливайте оба тайм-аута (иначе запрос может зависнуть навсегда). Хостинг и VPS-провайдеры часто устанавливают собственные тайм-ауты на уровне балансировщика нагрузки — они не отражены в конфиге nginx или Apache. Проверяйте документацию провайдера: у некоторых максимальный proxy_read_timeout ограничен 60 или 120 секундами.
Timeout настраивается в Nginx (proxy_read_timeout), HAProxy, балансировщиках. В PostgreSQL: statement_timeout, lock_timeout. В Redis: timeout для неактивных соединений. Для Docker: HEALTHCHECK --timeout. В Kubernetes: terminationGracePeriodSeconds.