Re: webdav в rest на nginx: upload, подзапрос, замена параметров запроса и ответа

Maxim Dounin mdounin на mdounin.ru
Пн Окт 4 22:11:17 MSD 2010


Hello!

On Mon, Oct 04, 2010 at 07:02:27PM +0400, Vasiliy Fedorov wrote:

> 2010/10/4 Maxim Dounin <mdounin at mdounin.ru>:
> >
> > В зависимости от конкретной задачи - можно либо сделать через
> > X-Accel-Redirect,
> 
> Для аплоадов это не подойдет, вроде.

Кто сказал?

> > либо взять какой-нибудь из модулей:
> > eval (http://grid.net.ru/nginx/eval.en.html), auth request
> > (http://mdounin.ru/hg/ngx_http_auth_request_module/).
> 
> Спасибо, как раз на последний смотрел, про pass_request_body и
> спрашивал ниже. Но нужно в зависимости от ответа менять заголовки и
> урл.
> 
> >> 3. Если нельзя -- ругнуться пользователю, если можно -- поменять
> >> request: method, uri, заголовки* -- и проксировать дальше.
> >
> > Менять методы и заголовки можно в коробке, про uri даже и не
> > говорю.
> 
> Да, спасибо, документацию я читал, то есть наличие всяких разных
> параметров мне известно. Сложности с их комбинациями :-)
> Конкретно в этом моменте ситуация осложняется тем что заголовки надо
> выставлять динамически, в зависимости от ответа на подзапрос,
> "подписывать запрос к Amazon S3".

Если делать через X-Accel-Redirect, то любые данные протаскиваются 
через $upstream_http_* - только надо не забыть запомнить их через 
set до того как следующее проксирование начнёт работу.

Если делать через auth request, то опять же любые данные 
протаскиваются через $upstream_http_*, в основном запросе доступны 
через auth_request_set.

> >> *: X-Accel-Redirect тут подходит плохо, хотя и используют для похожих
> >> вещей: http://kovyrin.net/2010/07/24/nginx-fu-x-accel-redirect-remote/
> >
> > X-Accel-Redirect подходит, но требует некоторой аккуратности в
> > написании конфигов.
> 
> То есть можно некоторыми ухищрениями добиться того чтоб контент не
> передавался для первого запроса, и передавался при редиректе?
> proxy_pass_request_body -- снова ключевое слово?

Да.

Только надо не забыть ещё и Content-Length в заголовках в 
соответствие привести, иначе протокол посыпется.

> > В большинстве случаев пропускать ещё не полученный запрос на
> > бекенд - излишняя трата ресурсов.  Кроме того, при таком подходе
> > пропадает возможность перепослать запрос на другой бекенд, если с
> > первым что-то случилось и он запрос недочитал.
> 
> Если проблема в этом, то можно запрос еще куда-нибудь копировать, но в
> общем-то можно сделать параметром конфигурации, наверно.
> 
> > Сделать подобный вариант обработки для больших постов безусловно
> > имеет смысл, но это a) требует времени и b) нужно далеко не всегда.
> >
> >> 2. Авторизация через другой сервер:
> >>     -- можно попробовать запрос направить на статический файлик с SSI
> >> инструкциями, первой инструкцией сходить авторизоваться, в зависимости
> >> от значения ответа вызывать разные SSI (не авторизован -- ошибка,
> >> авторизован -- вызвать url)
> >
> > Нет, так работать не будет.  Статический файл выкинет тело
> > запроса.
> 
> Понятно, спасибо.
> 
> >> P.S.: Директива proxy_pass_request_body есть в документации на
> >> английском (http://wiki.nginx.org/HttpProxyModule#proxy_pass_request_body),
> >> нет в документации на русском
> >> (http://sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html) и нет
> >> слов о ее отмене в changes (http://sysoev.ru/nginx/changes.html)
> >
> > Это недокументированная директива.
> 
> В смысле "забытая"? В changes есть слова о ее появлении.

Всмысле "Beware! Ogres!".  При некорректном использовании может 
быть больно.

Maxim Dounin



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