Re: proxy pass через Header

Maxim Dounin mdounin at mdounin.ru
Wed Mar 6 15:40:03 UTC 2013


Hello!

On Wed, Mar 06, 2013 at 09:53:49AM -0500, krain wrote:

> Maxim Dounin Wrote:
> -------------------------------------------------------
> > Hello!
> > 
> > On Wed, Mar 06, 2013 at 06:27:39AM -0500, krain wrote:
> > 
> > > nginx стоит балансировщиком и переадресует запросы  скажем 
> > > на группу серверов
> > > 192.168.0.1
> > > 192.168.0.2
> > > 192.168.0.2
> > > через  proxy_pass
> > > 
> > > Например запрос перешел на 192.168.0.1, можно ли как-то вернуть в
> > заголовке
> > > команду  для балансировщика 
> > > сменить upstream сервер с 192.168.0.1 на 192.168.0.2 или 192.168.0.3
> > (на
> > > тот, который укажет скрипт)
> > > Не передавая ничего в браузер пользователя (что-то вроде внутреннего
> > > редиректа, но на другой upstream сервер)
> > > 
> > > Как я понял proxy_next_upstream не подходит.
> > > 
> > > Задача в следующем:
> > > Если на сервере нет нужного файла, но скрипт определил где файл
> > находится
> > > (после запроса к базе данных) и готов указать указать 
> > > на каком сервере он лежит.
> > > Хочется чтобы балансировщик nginx переподключился к указанному
> > серверу.
> > > 
> > > Заранее спасибо за ответ.
> > 
> > Логичным решением было бы вернуть X-Accel-Redirect в location, 
> > который в свою очередь проксируется на нужный сервер.
> 
> Вроде как "X-Accel-Redirect:" только локально работает?
> (http://kovyrin.net/2010/07/24/nginx-fu-x-accel-redirect-remote/)

X-Accel-Redirect вызывает внутреннее перенаправление в nginx'е, а 
как полученный URI обработать - это лишь вопрос конфигурации.

> т.е. выдавая скриптом с сервера 192.168.0.1 ответ в header-е
> 
> X-Accel-Redirect: http://192.168.0.2/a.html
> бэкенд до ответа посетителю должен переслать запрос к 
> 192.168.0.2
> и если все ок, то отдать нормальный ответ посетителю?

Нет.  Нужно сделать как-то так:

    location / {
        proxy_pass http://all_backends;
    }

    location /files_on_server_1/ {
        proxy_pass http://server_1/;
    }

    location /files_on_server_2/ {
        proxy_pass http://server_2/;
    }

И возвращать X-Accel-Redirect /files_on_server_1/a.html.

> Возможно ли так передать POST запрос?

Если очень хочется - то можно.  Но вообще я бы не рекомендовал 
лишнего заниматься перенаправлениями POST-запросов.

-- 
Maxim Dounin
http://nginx.org/en/donation.html



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