Nginx + X-Accel-Redirect

materkov nginx-forum на forum.nginx.org
Сб Июн 4 13:51:11 UTC 2016


Спасибо, такой вариант сработал.

Максим, хотел бы в догонку задать вопрос не совсем связанный с предыдущим
вопросом, но связанный с 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 at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru

Posted at Nginx Forum: https://forum.nginx.org/read.php?21,267345,267372#msg-267372



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