Welcome! Log In Create A New Profile

Advanced

Re: Конфликт mirror и dav модулей

Roman Arutyunyan
February 07, 2018 10:20AM
Здравствуйте, Артем.

On Sat, Feb 03, 2018 at 10:48:42PM -0500, Artem Smorodin wrote:
> Здравствуйте, обнаружил конфликт в работе модулей Dav и Mirror.
>
> Пример конфигурации, при которой Dav модуль всегда будет возвращать HTTP
> 500, причем без записи в лог:
>
> location / {
> root /somedir;
> aio threads;
>
> client_max_body_size 30m;
> dav_access user:rw group:rw all:rw;
> dav_methods PUT;
> create_full_put_path on;
> client_body_temp_path /somedir/temp 1 2;
> mirror /mirror/127.0.0.2:80;
> }
>
> location ~* /mirror/(?<backend>.*) {
> internal;
> client_max_body_size 0;
> proxy_pass http://$backend/$request_uri;
> proxy_ignore_client_abort on;
> proxy_buffering off;
> proxy_method PUT;
> proxy_request_buffering off;
> proxy_connect_timeout 5s;
> }
>
>
> Так происходит из-за того, что модуль ngx_http_dav_module, который работает
> в фазе NGX_HTTP_CONTENT_PHASE требует, чтобы тело запроса было сохранено во
> временный файл
>
> r->request_body_in_file_only = 1;
> r->request_body_in_persistent_file = 1;
> r->request_body_in_clean_file = 1;
> r->request_body_file_group_access = 1;
> r->request_body_file_log_level = 0;
>
> rc = ngx_http_read_client_request_body(r, ngx_http_dav_put_handler);
>
> Однако модуль ngx_http_mirror_module, который работает в фазе
> NGX_HTTP_PRECONTENT_PHASE так же считывает содержимое тела запроса, но
> делает это раньше и с параметрами по умолчанию
>
> Default: client_body_in_file_only off;
>
> В итоге мы пытаемся повторно считать тело запроса, но метод
> ngx_http_read_client_request_body возвращает уже считанную информацию и
> проверка в методе ngx_http_dav_put_handler не проходит.
>
> static void
> ngx_http_dav_put_handler(ngx_http_request_t *r)
> {
>
> /****** some code here ******/
>
> if (r->request_body == NULL || r->request_body->temp_file == NULL) {
> ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
> return;
> }

В этом месте явно недоставало логгирования. Теперь оно есть:

http://hg.nginx.org/nginx/rev/573f20116163

> По идее, чтобы сохранить независимость модулей нужно реализовывать сброс
> считанного буфера в файл, но лично я решил проблему просто добавив
> директиву
>
> client_body_in_file_only clean;

Да, решение выглядит правильным.

> Если я прав, добавьте, пожалуйста, эту информацию в документацию.

Да, стоит добавить. Спасибо.

--
Roman Arutyunyan
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

Конфликт mirror и dav модулей

Artem Smorodin February 03, 2018 10:48PM

Re: Конфликт mirror и dav модулей

Roman Arutyunyan February 07, 2018 10:20AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 202
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready