keepalive upstream
Тема дорожной карты · Nginx
Keepalive-соединения к upstream в Nginx позволяют обратному прокси повторно использовать постоянные TCP-соединения с бэкенд-серверами вместо того, чтобы открывать и закрывать новое соединение для каждого проксируемого запроса, значительно снижая накладные расходы на соединение и задержку в высоконагруженных конфигурациях балансировки. Директива keepalive размещается внутри блока upstream и задаёт максимальное число простаивающих keepalive-соединений, кэшируемых на воркер: upstream backend { server 10.0.0.1; keepalive 32; }. Чтобы keepalive к upstream корректно работал с постоянными соединениями HTTP/1.1, прокси должен также задать proxy_http_version 1.1; и proxy_set_header Connection ""; в соответствующем блоке location, переопределяя поведение HTTP/1.0 по умолчанию, которое закрывает соединения после каждого запроса. Keepalive-соединения к upstream особенно эффективны, когда Nginx стоит перед микросервисами или API через SSL/TLS upstream-ссылки, где стоимость TLS-рукопожатия делает повторное использование соединений ещё более ценным. Мониторинг переменных upstream_connect_time и upstream_response_time в журнале доступа — лучший способ оценить выигрыш в производительности от настройки upstream keepalive в развёртывании обратного прокси Nginx.
Как это работает
keepalive upstream — самая частая 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.
Типичные ошибки
Ловушки keepalive upstream: не прокидывают 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 не обработаны грациозно (дефолтная страница уродлива).