Re: Upstream и заголовок Host

Maxim Dounin mdounin на mdounin.ru
Вт Янв 22 14:31:37 UTC 2019


Hello!

On Tue, Jan 22, 2019 at 09:54:12AM +0300, CoDDoC via nginx-ru wrote:

> Доброе время суток!
> 
> Тестовый сервер: test.local. В нем тестовый кластер:
> upstream cdn {
>     server <IP_1>:<port_1>;
>     server <IP_2>:<port_2>;
>     ....
> }
> 
> или:
> upstream cdn {
>     server cdn001.test.local:<port_1>;
>     server cdn002.test.local:<port_2>;
>     ....
> }
> 
> Не принципиально, ибо "cdn001.test.local" резолвится в <IP_1> и т.д.
> 
> Само собой, "proxy_http_version 1.1;" и из какого-то локейшена "proxy_pass http://cdn;"
> Теперь смотрю, что приходит, например, на выбранный бэкенд.
> Ожидаю там увидеть в заголовке Host значение <IP> или 'cdn###.test.local'.
> Вижу: http header: "Host: cdn". Что не так?

А можно вопрос - почему вы ожидаете увидеть в заголовке Host 
"<IP> или 'cdn###.test.local'"?

Документация по данному вопросу однозначна, да и, скажем, 
прописывая в DNS соответствующие A или CNAME-записи никто не 
ожидает, что в запросах будет заголовок Host, соответствующий 
содержимому записи.

Почему от блоков upstream вдруг ожидается какое-то другое 
поведение?

На всякий случай уточню - вопрос вполне серьёзный, хочется 
понять, на какие аналогии опираются люди, считающие, что заголовок 
Host должен зависеть от того, на какой IP-адрес из списка был 
отправлен запрос.  Вроде бы аналогия с DNS очевидна, и она 
подразумевает именно именно то поведение, которое есть сейчас, но 
почему-то людей, предполагающих другое поведение, много.

[...]

> Попутно вопрос о $upstream_addr.
> Ее можно еще как-то использовать, кроме как в логах? Например, отправить в php, но без костылей?

Нет.  Запрос формируется до выбора бэкенда, на который этот запрос 
будет отправлен (а в рамках proxy_next_upstream - один и тот же 
запрос может быть отправлен на несколько бэкендов).  Соотвественно 
переменную $upstream_addr можно использовать в логах (а равно при 
обработке ответа бэкенда - скажем, в add_header), но бессмысленно 
использовать в запросе на бэкенд - на момент формирования запроса 
она всегда будет пустой.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru