Конфликт mirror и dav модулей
Artem Smorodin
nginx-forum на forum.nginx.org
Вс Фев 4 03:48:42 UTC 2018
Здравствуйте, обнаружил конфликт в работе модулей 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;
}
По идее, чтобы сохранить независимость модулей нужно реализовывать сброс
считанного буфера в файл, но лично я решил проблему просто добавив
директиву
client_body_in_file_only clean;
Если я прав, добавьте, пожалуйста, эту информацию в документацию.
Posted at Nginx Forum: https://forum.nginx.org/read.php?21,278335,278335#msg-278335
Подробная информация о списке рассылки nginx-ru