Re: Добавление заголовка после upstream

Ekaterina Kukushkina ek на nginx.com
Ср Июл 29 07:25:27 UTC 2015


Привет.

On Wed, Jul 29, 2015 at 01:34:59AM -0400, Budulianin wrote:
> >В ответ клиенту добавить?
> Добавить в запрос, который перенаправится какой-то ноде, после того, как она
> будет выбрана в upstream.
> Т.е. upstream уже выбран, мы его только теперь знаем(адрес ноды) и тогда мы
> добавляем его в header и он отправляется в ноду.
> 

Запрос для передачи на апстрим формируется один раз и после этого не 
меняется. И в этом неизменном виде передается на выбранный апстрим. Если 
выбранный не отвечает, тот же самый запрос, сформированный ранее, может 
передаваться на другой апстрим (в зависимости от настроек 
proxy_next_upstream). Таким образом, эта переменная может содержать не 
только IP адрес, но и список IP адресов всех потыканных серверов. 

Вообще, использование upstream предполагает и требует использование 
идентично настроенных бэкэндов. Если они у вас различаются, то надо 
разносить их по разным группам и проксировать на разные группы в разных 
локейшенах. 

Есть несолько решений, которые позволяют добиться желаемого.
1. Для каждого бэкэнда определить отдельный виртуальный сервер и повесить 
его на какой-нибудь 127.0.0.1:9995 и т.д. В нем можно указать желаемые 
заголовки, специфичные для данного сервера. И в upstream определять не сами 
бэкэнды, а эти виртуальные сервера. (Но не забудьте сохранить все кастомные 
заголовки)

2. Отказываться от алгоритмов баллансировки nginx и мутить свой лунапарк, 
например, через map задавать используемый апстрим для группы ипользуемых 
key. Все key перечислять не надо, можно воспоользоваться регулярными 
выражениями. И после этого в proxy_pass указывать значение полученное в 
map. В этом случае на бэкэнды будет прилеть хидер Host, в котором будет 
указан желаемый IP адрес. 
Но, увы, это полностью убьет все плюшки upstream (такие как, next_upstream, 
weight и т.д)
 
Но зачем все это?

> Если ставить proxy_set_header рядом с proxy_pass, то заголовок не
> добавляется, я так понимаю, что переменная ещё пустая, поэтому
> заголовок не ставится. Но где уже известна эта переменная? Только в блоке
> upstream? Но там нельзя устанавливать заголовок.
> 
> map $http_upgrade $connection_upgrade {
>     default upgrade;
>     '' close;
> }
> 
> upstream tornado {
>     hash $arg_key;
> 
>     server 127.0.0.1:9995;
>     server 127.0.0.1:9996;
>     server 127.0.0.1:9997;
>     server 127.0.0.1:9998;
>     server 127.0.0.1:9999;
> 
> }
> 
> 
> server {
>     listen 8080 default_server;
> 
>     access_log /var/log/nginx/prototypes-nginx-access.log;
>     error_log /var/log/nginx/prototypes-nginx-error.log;
> 
>     location /ws/ {
>         proxy_pass http://tornado;
>         proxy_set_header Test-Header1 123;
>         proxy_set_header Test-Header2 $upstream_addr;
>         proxy_set_header Test-Header3 $host;
>         proxy_http_version 1.1;
>         proxy_set_header Upgrade $http_upgrade;
>         proxy_set_header Connection $connection_upgrade;
>     }
> 
> }
> 

-- 
Ekaterina Kukushkina



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