Welcome! Log In Create A New Profile

Advanced

Re: Nginx + X-Accel-Redirect

June 04, 2016 09:51AM
Спасибо, такой вариант сработал.

Максим, хотел бы в догонку задать вопрос не совсем связанный с предыдущим вопросом, но связанный с X-Accel-Redirect. На каком-то из форумов (возможно что здесь же, не помню точно) вы кому-то ответили, что только при переадресации на named location, запрос сохраняется неизменным (POST запрос остается POST запросом вместе с телом). А вот при переадресации на обычную location POST запросы становятся GET. С чем связано такое поведение? А именно, хочу понять, не является ли штука с named location каким-то "хаком", не очень желательным и который может исчезнуть в новых версиях.

Вообще, X-Accel-Redirect придумана для раздачи статики. Я использую ее для того чтобы разгрузить основной бекенд от запросов, в которых совершаются длительные HTTP-запросы к внешним ресурсам (длительных - это примерно секунд по 30). Поэтому возникла такая задача. Не является ли вообще такой подход bad design, или все-таки неверный инструмент для решения такой задачи?


Maxim Dounin Wrote:
-------------------------------------------------------
> Hello!
>
> On Fri, Jun 03, 2016 at 03:51:00AM -0400, materkov wrote:
>
> > Здравствуйте!
> >
> > Пытаюсь настроить X-Accel-Redirect.
> > Вот такой конфиг:
> >
> > location /api {
> > proxy_pass http://127.0.0.1:8000;
> > }
> >
> > location @tornado {
> > internal;
>
> Just a side note: директива "internal" в именованных location'ах
> не нужна, иначе как в результате перенаправления в такой location
> в любом случае не попасть.
>
> > proxy_set_header X-foo1 $upstream_http_myheader;
> > proxy_set_header X-foo2 $upstream_status;
> > proxy_pass http://127.0.0.1:8888;
> > }
> >
> > Вот такой код в первом апстриме (Django):
> >
> > def app_hyper_report(request):
> > r = api.Response()
> > r['myheader'] = 10
> > r['X-Accel-Redirect'] = '@tornado'
> > return r
> >
> > То есть здесь идет переадресация через X-Accel-Redirect на второй
> апстрим.
> > При этом, нужно передать во второй апстрим некоторые параметры.
> Пытаюсь это
> > сделать через headers. Столкнулся с проблемой: почему-то не работает
> > передача headers через $upstream_http_myheader (в то время как
> > $upstream_status срабатывает нормально).
> >
> > В чем здесь может быть проблема?
>
> Проблема в том, что в момент выполнения proxy_set_header уже
> началась работа новым upstream'ом, и значения переменных
> $upstream_http_* и $upstream_status - пустые.
>
> Решается сохранением нужных значений в промежуточные переменные с
> помощью set, как-то так:
>
> location @tornado {
> set $saved_myheader $upstream_http_myheader;
> set $saved_status $upstream_status;
> proxy_set_header X-foo1 $saved_myheader;
> proxy_set_header X-foo2 $saved_status;
> proxy_pass http://127.0.0.1:8888;
> }
>
> --
> Maxim Dounin
> http://nginx.org/
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

Nginx + X-Accel-Redirect

materkov June 03, 2016 03:51AM

Re: Nginx + X-Accel-Redirect

Maxim Dounin June 04, 2016 08:38AM

Re: Nginx + X-Accel-Redirect

materkov June 04, 2016 09:51AM

Re: Nginx + X-Accel-Redirect

Maxim Dounin June 06, 2016 09:26AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 323
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready