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