Заголовки прокси

Тема дорожной карты · Nginx

Когда Nginx работает как обратный прокси, он должен передавать соответствующие HTTP-заголовки вышестоящим серверам, чтобы код приложения мог определить исходный IP-адрес клиента, протокол и имя хоста, а не видеть только внутренний адрес Nginx. Директива proxy_set_header используется для определения заголовков, передаваемых upstream; наиболее критичны proxy_set_header Host $host, proxy_set_header X-Real-IP $remote_addr и proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for, которые вместе сохраняют контекст запроса через слой обратного прокси. Nginx также поддерживает proxy_set_header X-Forwarded-Proto $scheme, позволяющий бэкенд-приложениям узнать, было ли исходное соединение по HTTP или HTTPS, что критично для генерации корректных URL редиректов и применения политик HSTS. По умолчанию Nginx очищает заголовки с пустыми значениями при передаче upstream, а директива proxy_pass_request_headers on (включена по умолчанию) управляет тем, все ли исходные клиентские заголовки передаются. Тщательная настройка заголовков прокси в каждом блоке location, использующем proxy_pass, является требованием безопасности и корректности для любого развёртывания обратного прокси Nginx, обрабатывающего реальный пользовательский трафик.

Как это работает

Заголовки прокси — самая частая 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.

Типичные ошибки

Ловушки Заголовки прокси: не прокидывают 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 не обработаны грациозно (дефолтная страница уродлива).

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…