proxy_read_timeout
Тема дорожной карты · Nginx
Nginx предоставляет несколько директив таймаута, управляющих тем, как долго обратный прокси ожидает на различных этапах взаимодействия с вышестоящим сервером, предотвращая удержание соединений медленными или не отвечающими бэкендами и деградацию общей производительности веб-сервера. Директива proxy_connect_timeout задаёт максимальное время ожидания Nginx при установке соединения с upstream (по умолчанию 60s), proxy_send_timeout ограничивает время ожидания между последовательными записями в upstream, а proxy_read_timeout управляет максимальным интервалом между последовательными чтениями из ответа upstream. Установка proxy_read_timeout 30s — распространённая практика настройки для API-развёртываний обратного прокси, где ответы upstream должны приходить быстро, тогда как длительные операции вроде загрузки файлов или Server-Sent Events могут требовать значений 300s и выше. Директивы таймаута прокси применяются к отдельным операциям чтения/записи, а не ко всей длительности запроса, поэтому медленный потоковый ответ, непрерывно отправляющий данные, не будет прерван. Правильная настройка таймаутов в Nginx критически важна для надёжности балансировки нагрузки: хорошо подобранный proxy_read_timeout совместно с proxy_next_upstream timeout позволяет Nginx переключиться на работоспособный upstream-сервер при недоступности бэкенда.
Как это работает
proxy_read_timeout — самая частая production-роль nginx: принять HTTP от клиентов, пробросить на upstream-backend. proxy_pass http://backend; (с опциональным upstream-блоком для нескольких backend). Прокидывайте client-инфу через proxy_set_header X-Real-IP $remote_addr;, X-Forwarded-For $proxy_add_x_forwarded_for, X-Forwarded-Proto $scheme, Host $host. Таймауты (proxy_connect_timeout, proxy_send_timeout, proxy_read_timeout) предотвращают зависание. WebSocket-поддержка через proxy_http_version 1.1 + Connection: upgrade.
Когда применять
Всегда прокидывайте X-Forwarded-For + X-Real-IP — backend-логи/аудит зависят от реального client-IP. Всегда разумные таймауты; дефолты слишком мягкие (60s) для многих приложений — подгоняйте под SLO. proxy_buffering off — для streaming-ответов (SSE, long polling). keepalive 32; в upstream-блоке — для переиспользования соединений с backend.
Типичные ошибки
Ловушки proxy_read_timeout: не прокидывают X-Forwarded-Proto и backend решает HTTPS на основе своего req.protocol (всегда HTTP за nginx); proxy_pass http://backend без trailing slash иногда дополняет location URI (тонкие URL-rewrite — читайте доку); upstream без keepalive (TCP-handshake на каждый запрос); 502 / 504 не обработаны грациозно (дефолтная страница уродлива).