帶有身份驗證請求的 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 failure: Connection reset by peer?
為什麼?
尾 -f /var/log/nginx/error.log
2012/11/16 17:53:42
$$ alert $$30060#0:工作程序 8374 在信號 11 上退出 尾調試日誌,驗證請求後:
2012/11/16 07:00:33
$$ debug $$8241#0: *1892 發送 100 繼續
2012/11/16 07:00:33$$ debug $$8241#0: *1892 發送: fd:458 25 of 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 客戶端請求正文休息 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?” a:1, c: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 發布事件 0000000001789C58
2012/11/16 07:00:33$$ debug $$8241#0: *1894 發布事件 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 of 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 事件計時器刪除:461:1353027638785
2012/11/16 07:00:33$$ debug $$8241#0:*1894 可重用連接:0
2012/11/16 07:00:33$$ debug $$8241#0: *1894 免費: 00000000016610F0
2012/11/16 07:00:33$$ debug $$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 發布事件 0000000001789B88
2012/11/16 07:00:33$$ debug $$8241#0: *1892 發布事件 000000000179D398
2012/11/16 07:00:33$$ debug $$8241#0: *1892 刪除已發布的事件 000000000179D398
2012/11/16 07:00:33$$ debug $$8241#0:* 1892 http 執行請求:“/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 腳本變數:“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 put 文件名: “/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 刪除事件: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_module.c /61_http_module.c/61
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 /模組/ 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在SRC / HTTP / ngx_http_request.c ngx_http_request_handler(EV = 0x161e9f8):1846 40:
在ngx_event_process_posted 7 0x000000000042e308在SRC /事件/ ngx_event_posted.c(週期= 0x156be60,貼= 0x71edc0)
8 0x0000000000434f59在ngx_worker_process_cycle(週期= 0x156be60 , data=) at src/os/unix/ngx_process_cycle.c:806
9 0x00000000004338b5 in ngx_spawn_process (cycle=0x156be60, proc=0x434ea0, data=0x0, name=0x4d4de8 “worker process”, respawn=-4) at src/os /unix/ngx_process.c:198
10 0x00000000004352ca 在 src/os/unix/ngx_process_cycle.c:365 11 0x0000000000435fda 中的 ngx_start_worker_processes (cycle=0x156be60, n=20, type=-4) at src/os/unix/ngx_process_cycle.c:365
11 0x0000000000435fda in ngx_master_process_cycle (cycle=/01) os/unix/ngx_process_cycle.c:250
12 0x0000000000415efe 在 src/core/nginx.c:410 的 main (argc=, argv=)
您看到的問題是兩個實際問題的組合:
- nginx核心中的問題,在某些情況下會導致請求正文被錯誤地讀取。在您的情況下,此問題是由身份驗證請求模組觸發的。這個問題正在調查中。
- 如果在 dav 模組的控制下未讀取請求正文,則 dav 模組中的錯誤會導致 nginx 取消引用空指針。該錯誤在正常情況下不會出現,但由於上述問題,您已經遇到了。