Привет. 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 mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru