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