ngx_http_auth_request_module
Maxim Dounin
mdounin at mdounin.ru
Fri Apr 12 12:51:33 UTC 2013
Hello!
On Fri, Apr 12, 2013 at 12:20:05PM +0100, Anatoly Mikhailov wrote:
>
> On Apr 12, 2013, at 10:29 AM, Maxim Dounin <mdounin at mdounin.ru> wrote:
>
> > Hello!
> >
> > On Thu, Apr 11, 2013 at 05:15:15PM +0100, Anatoly Mikhailov wrote:
> >
> >>
> >> On Apr 10, 2013, at 12:43 AM, Maxim Dounin <mdounin at mdounin.ru> wrote:
> >>
> >>> Hello!
> >>>
> >>> On Tue, Apr 09, 2013 at 08:30:17PM +0100, Anatoly Mikhailov wrote:
> >>>
> >>>
> >>> Так - должно работать, смотрите внимательно, что у вас в коде
> >>> авторизатора на бекенде происходит. Видимо, он пытается лезть в
> >>> тело, и вполне логично, что тела не находит - его ещё не читали.
> >>
> >> на бэкэнде у нас примитивный Rack, который к сожалению не пускает
> >> запрос с пустым BODY, придется ограничиться Basic HTTP Auth для
> >> запроса /upload...
> >
> > Как вам будет угодно. Но вообще - сделать body непустым, или
> > убрать из запроса то, что ваш бекенд воспринимает в штыки - это ни
> > разу не проблема:
> >
> > http://nginx.org/r/proxy_set_header
> > http://nginx.org/r/proxy_set_body
> > http://nginx.org/r/proxy_method
> >
> > Собственно, есть все механизмы для того, чтобы полностью
> > сформировать запрос на бекенд.
> >
>
> так (proxy_set_body off) заработало, спасибо
>
> location = /authentication/check {
> proxy_set_header Content-Length "";
> proxy_pass_request_body off;
> proxy_set_body off;
> proxy_buffering off;
> proxy_pass http://unicorn_api/authentication/check;
> }
Даже странно, честно говоря:
- "proxy_set_body off" установит тело запроса в "off",
что вероятно не совсем то, что вы хотели получить;
- при этом "proxy_set_header Content-Length" таки уберёт
из запроса Content-Length, и в результате передаваемые данные
тела ("off") повиснут в воздухе;
- "proxy_pass_request_body off" при использовании proxy_set_body
смысла не имеет, исходное тело запроса в любом случае передано
не будет.
Скорее всего для удовлетворения поребностей вашего бекенда
достаточно будет сделать так:
location = /authentication/check {
proxy_set_body "stub";
proxy_pass http://unicorn_api/authentication/check;
}
> В итоге "client_body_in_file_only on" и плагин "http_auth_request" в тандеме превращаются
> в отличное решение для аплоада больших файлов без необходимости пропускать их
> файл через сокет (лишние операции копирования).
Для того, чтобы данные лишний раз не пропускались через сокет -
вполне достаточно одного client_body_in_file_only. Если мне не
изменяет память, прозрачная поддержка этого со стороны php была
одной из killer features php-fpm. Исходно документация была, судя
по всему, тут:
http://php-fpm.org/wiki/Features#Accelerated_upload_support
К сожалению, сейчас по ссылке выше возвращается ошибка.
> Плюс ко всему - предварительная
> бэкэнд-аутентификация, которая не дает начать аплоад, если она не пройдена.
> Насколько я понимаю, при обычном аплоаде бэкэнд-аутентификация запускается
> только после того, как файл уже загружен и пропущен через сокет?
Да.
Но есть нюанс: если аутентификация таки не пройдёт, то, как и в
случае ошибки 413, у браузера может не получиться нормально
прочитать ответ.
> Вопрос только один - почему эти просто замечательные вещи слабо документированы? :)
> Вы даже не представляете, насколько это востребованная типовая задача, которую
> почти всегда решают с помощью костылей, но nginx уже имеет все, что нужно.
Да, недостаток HOWTO, не требующих думать, для типовых задач - это
одна из основных проблем нашей текущей документации.
С другой стороны, вот конкретно эта задача - она из области
нетривиальных оптимизаций, и вряд ли стоит ожидать, что под неё в
официальной документации найдётся HOWTO, из которого можно будет
скопировать конфиг.
--
Maxim Dounin
http://nginx.org/en/donation.html
Подробная информация о списке рассылки nginx-ru