Nginx

帶有身份驗證請求的 nginx webdav 伺服器

  • November 21, 2012

我的 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 取消引用空指針。該錯誤在正常情況下不會出現,但由於上述問題,您已經遇到了。

引用自:https://serverfault.com/questions/449195