Nginx + X-Accel-Redirect
Maxim Dounin
mdounin на mdounin.ru
Сб Июн 4 12:36:19 UTC 2016
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