nginx webdav сервер с запросом авторизации
Мой nginx.conf:
location ~ ^/api/(.*)$ {
alias /home/username/apidav/$remote_user/$1;
client_body_temp_path /var/www/path/;
client_max_body_size 50m;
dav_methods PUT DELETE MKCOL;# COPY MOVE;
create_full_put_path on;
dav_access user:rw group:rw all:r;
dav_ext_methods PROPFIND OPTIONS;
auth_request /api_auth;
}
location /api_auth {
internal;
proxy_pass http://www.domain.ru/accounts/api_auth/;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
curl -T test.txt ' http://gert:passwd@www.domain.ru/api/' curl: (56) Ошибка Recv: сброс соединения другим пользователем?
Зачем?
tail -f /var/log/nginx/error.log
2012/11/16 17:53:42 [alert] 30060 # 0: рабочий сигнал 8374 завершен по сигналу 11
Журнал Tail Debug, после запроса авторизации:
2012/11/16 07:00:33 [debug] 8241#0: *1892 отправить 100 Продолжить
2012/11/16 07:00:33 [debug] 8241#0: *1892 отправить: fd:458 25 из 25
2012/11/16 07:00:33 [debug] 8241#0: *1892 http прочитать тело запроса клиента
2012/11/16 07:00:33 [debug] 8241#0: *1892 recv: fd: 458 -1 of 91
2012/11/16 07:00:33 [debug] 8241#0: *1892 recv () не готова (11: ресурс временно недоступен)
2012/11/16 07:00:33 [debug] 8241#0: *1892 http тело запроса клиента recv -2
2012/11/16 07:00:33 [debug] 8241#0: *1892 http тело запроса клиента rest 91
2012/11/16 07:00:33 [debug] 8241#0: *1892 добавлен таймер событий: 458: 60000: 1353027693786
2012/11/16 07:00:33 [debug] 8241#0: *1892 http завершить запрос: -4, "/api/test.txt?" а:1, с: 2
2012/11/16 07:00:33 [debug] 8241#0: *1892 Количество http запросов: 2 blk: 0
2012/11/16 07:00:33 [debug] 8241#0: *1894 post event 0000000001789C58
2012/11/16 07:00:33 [debug] 8241#0: *1894 post event 000000000179D468
2012/11/16 07:00:33 [debug] 8241#0: *1894 удалить опубликованное событие 000000000179D468
2012/11/16 07:00:33 [debug] 8241#0: *1894 http пустой обработчик
2012/11/16 07:00:33 [debug] 8241#0: *1894 удалить опубликованное событие 0000000001789C58
2012/11/16 07:00:33 [debug] 8241#0: *1894 http - задерживающийся обработчик закрытия
2012/11/16 07:00:33 [debug] 8241#0: *1894 recv: fd:461 0 из 4096
2012/11/16 07:00:33 [debug] 8241#0: *1894 задерживается чтение: 0
2012/11/16 07:00:33 [debug] 8241#0: *1894 http запрос количества: 1 blk: 0
2012/11/16 07:00:33 [debug] 8241#0: *1894 http закрыть запрос
2012/11/16 07:00:33 [debug] 8241#0: *1894 http обработчик журнала
2012/11/16 07:00:33 [debug] 8241#0: *1894 бесплатно: 0000000000000000
2012/11/16 07:00:33 [debug] 8241#0: *1894 бесплатно: 00000000016DE8A0, не используется: 1
2012/11/16 07:00:33 [debug] 8241#0: *1894 бесплатно: 0000000001605050, не используется: 327
2012/11/16 07:00:33 [debug] 8241#0: *1894 закрыть http-соединение: 461
2012/11/16 07:00:33 [debug] 8241#0: *1894 таймер событий del: 461: 1353027638785
2012/11/16 07:00:33 [debug] 8241#0: *1894 многоразового подключения: 0
2012/11/16 07:00:33 [отладка] 8241 # 0: * 1894 бесплатно: 00000000016610F0
2012/11/16 07:00:33 [отладка] 8241 # 0: * 1894 бесплатно: 00000000015BFAA0
2012/11/16 07:00:33 [debug] 8241#0: *1894 бесплатно: 00000000015F0050, неиспользовано: 8
2012/11/16 07:00:33 [debug] 8241#0: *1894 бесплатно: 000000000163E980, неиспользовано: 112
2012/11/16 07:00:33 [debug] 8241#0: *1892 post event 0000000001789B88
2012/11/16 07:00:33 [debug] 8241#0: *1892 post event 000000000179D398
2012/11/16 07:00:33 [debug] 8241#0: *1892 удалить опубликованное событие 000000000179D398
2012/11/16 07:00:33 [debug] 8241#0: *1892 http run request: "/api/test.txt?"
2012/11/16 07:00:33 [debug] 8241#0: *1892 фаза контента: 19
2012/11/16 07:00:33 [debug] 8241#0: *1892 Копия http-скрипта: "/ home / username / apidav /"
2012/11/16 07:00:33 [debug] 8241#0: *1892 http script var: "gert"
2012/11/16 07:00:33 [debug] 8241#0: *1892 Копия сценария http: "/"
2012/11/16 07:00:33 [debug] 8241#0: *1892 Захват сценария http: "test.txt"
2012/11/16 07:00:33 [debug] 8241#0: *1892 http положить имя файла: "/home/username/apidav/gert/test.txt"
2012/11/16 07:00:33 [debug] 8285 # 0: событие добавления epoll: fd: 9 op: 1 ev: 00000001
2012/11/16 07:36:55 [debug] 8255 # 0: событие добавления epoll: fd: 9 op: 1 ev: 00000001
2012/11/16 07:36:55 [debug] 8285 # 0: epoll del event: fd: 9 op: 2 ev: 00000000
основной дамп
(GDB) Bt
0 ngx_ext_rename_file (src = 0x8, to = 0x7fffcaa10870, ext = 0x7fffcaa10840) в src / core / ngx_file.c: 545
1 0x0000000000472864 в ngx_http_dav_put_handler (r=0x1581fe0) в src / http / modules / ngx_http_dav_module.c: 261
2 0x0000000000450a55 в ngx_http_read_client_request_body (r=0x1581fe0, post_handler=0x472730) в src / http / ngx_http_request_body.c: 155
3 0x0000000000473873 в ngx_http_dav_handler (r=0x1581fe0) в src / http / modules / ngx_http_dav_module.c: 172
4 0x0000000000443676 в ngx_http_core_content_phase (r=0x1581fe0, ph=0x14e7de0) в src / http / ngx_http_core_module.c: 1403
5 0x000000000043e215 в ngx_http_core_run_phases (r=0x1581fe0) в src / http / ngx_http_core_module.c: 877
6 0x0000000000448b13 в ngx_http_request_handler (ev=0x161e9f8) в src / http / ngx_http_request.c: 1846
7 0x000000000042e308 в ngx_event_process_posted (цикл =0x156be60, опубликовано =0x71edc0) в src / event / ngx_event_posted.c: 40
8 0x0000000000434f59 в ngx_worker_process_cycle (цикл =0x156be60, данные =) в src / os / unix / ngx_process_cycle.c: 806
9 0x00000000004338b5 в ngx_spawn_process (цикл =0x156be60, proc=0x434ea0, data=0x0, name=0x4d4de8 "рабочий процесс", respawn=-4) в src / os / unix / ngx_process.c: 198
10 0x00000000004352ca в ngx_start_worker_processes (цикл =0x156be60, n=20, тип = -4) в src / os / unix / ngx_process_cycle.c: 365
11 0x0000000000435fda в ngx_master_process_cycle (цикл =0x156be60) в src / os / unix / ngx_process_cycle.c: 250
12 0x0000000000415efe в основном (argc=, argv=) в src/core/nginx.c:410
1 ответ
Проблема, которую вы видите, представляет собой сочетание двух актуальных проблем:
Проблема в ядре nginx, которая в некоторых случаях приводит к неправильному чтению тела запроса. В вашем случае эта проблема вызывается модулем запроса авторизации. Эта проблема находится в стадии расследования.
Ошибка в модуле dav, из-за которой nginx разыменовывает нулевой указатель, если тело запроса не было прочитано под управлением модуля dav. Ошибка не проявляется в нормальных условиях, но из-за вышеуказанной проблемы вы ее обнаружили.