带有身份验证请求的 nginx webdav 服务器

带有身份验证请求的 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 测试.txt'http://gert:[电子邮件保护]/api/' curl:(56)接收失败:对端重置连接?

为什么?

tail -f /var/log/nginx/error.log
2012/11/16 17:53:42 [alert] 30060#0: 工作进程 8374 在信号 11 上退出

尾部调试日志,认证请求之后:

2012/11/16 07:00:33 [调试] 8241#0: *1892 发送 100 继续
2012/11/16 07:00:33 [调试] 8241#0: *1892 发送:fd:458 25/25
2012/11/16 07:00:33 [调试] 8241#0: *1892 http 读取客户端请求正文
2012/11/16 07:00:33 [调试] 8241#0: *1892 recv:fd:458 -1/91
2012/11/16 07:00:33 [调试] 8241#0: *1892 recv() 未准备好 (11:资源暂时不可用)
2012/11/16 07:00:33 [调试] 8241#0:*1892 http客户端请求主体recv -2
2012/11/16 07:00:33 [调试] 8241#0:*1892 http客户端请求主体rest 91
2012/11/16 07:00:33 [调试] 8241#0:*1892事件计时器添加:458:60000:1353027693786
2012/11/16 07:00:33 [调试] 8241#0:*1892 http完成请求:-4,“/api/test.txt?” a:1,c:2
2012/11/16 07:00:33 [调试] 8241#0:*1892 http请求数:2 blk:0
2012/11/16 07:00:33 [调试] 8241#0:*1894发布事件0000000001789C58
2012/11/16 07:00:33 [调试] 8241#0:*1894发布事件000000000179D468 2012/11/16 07:00:33 [调试] 8241#0
:*1894删除发布事件000000000179D468
2012/11/16 07:00:33 [调试] 8241#0:*1894 http 空处理程序
2012/11/16 07:00:33 [调试] 8241#0:*1894 删除已发布事件 0000000001789C58
2012/11/16 07:00:33 [调试] 8241#0:*1894 http 延迟关闭处理程序
2012/11/16 07:00:33 [调试] 8241#0:*1894 recv:fd:461 0 of 4096
2012/11/16 07:00:33 [调试] 8241#0:*1894 延迟读取:0
2012/11/16 07:00:33 [调试] 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 可用:000000000000000
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 [调试] 8241#0:* 1894 关闭http连接:461
2012/11/16 07:00:33 [调试] 8241#0:* 1894事件计时器del:461:1353027638785
2012/11/16 07:00:33 [调试] 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 [调试] 8241#0:*1894 可用:00000000015F0050,未使用:8
2012/11/16 07:00:33 [调试] 8241#0:*1894 可用:000000000163E980,未使用:112
2012/11/16 07:00:33 [调试] 8241#0:*1892 发布事件 0000000001789B88
2012/11/16 07:00:33 [调试] 8241#0:*1892 发布事件 000000000179D398
2012/11/16 07:00:33 [调试] 8241#0:*1892 删除发布事件 000000000179D398
2012/11/16 07:00:33 [调试] 8241#0:*1892 http 运行请求:“/api/test.txt?”
2012/11/16 07:00:33 [调试] 8241#0:*1892 内容阶段:19
2012/11/16 07:00:33 [调试] 8241#0:*1892 http 脚本复制:“/home/username/apidav/”
2012/11/16 07:00:33 [调试] 8241#0:*1892 http 脚本变量:“gert”
2012/11/16 07:00:33 [调试] 8241#0:*1892 http 脚本复制:“/”
2012/11/16 07:00:33 [调试] 8241#0:*1892 http 脚本捕获:“test.txt”
2012/11/16 07:00:33 [调试] 8241#0:*1892 http put 文件名:“/home/username/apidav/gert/test.txt”
2012/11/16 07:00:33 [调试] 8285#0:epoll 添加事件:fd:9 op:1 ev:00000001
2012/11/16 07:36:55 [调试] 8255#0:epoll 添加事件:fd:9 op:1 ev:00000001
2012/11/16 07:36:55 [调试] 8285#0:epoll del 事件: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 (cycle=0x156be60, posted=0x71edc0) 在 src/event/ngx_event_posted.c:40
8 0x0000000000434f59 在 ngx_worker_process_cycle (cycle=0x156be60, data=) 在 src/os/unix/ngx_process_cycle.c:806
9 0x00000000004338b5 在 ngx_spawn_process (cycle=0x156be60, proc=0x434ea0 , data=0x0, name=0x4d4de8 "worker process", respawn=-4) 在 src/os/unix/ngx_process.c:198
10 0x00000000004352ca 在 ngx_start_worker_processes (cycle=0x156be60, n=20, type=-4) 在 src/os/unix/ngx_process_cycle.c:365
11 0x0000000000435fda 在 ngx_master_process_cycle (cycle=0x156be60) 在 src/os/unix/ngx_process_cycle.c:250
12 0x0000000000415efe 在 main (argc=, argv=) 在 src/core/nginx.c:410

答案1

您看到的问题是两个实际问题的组合:

  • nginx core 中的问题,导致某些情况下请求体读取错误。您的情况中,该问题是由 auth 请求模块触发的。该问题正在调查中。

  • dav 模块中的错误如果请求主体未在 dav 模块的控制下读取,则会导致 nginx 取消引用空指针。该错误在正常情况下不会显现,但由于上述问题,您遇到了它。

相关内容