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