为什么nginx会断开我的下载? (超时?)

时间:2013-10-23 17:29:16

标签: node.js nginx proxy timeout

我有一个nginx服务器,它提供文件,向php发送请求,以及代理到node.js后端服务器。这个node.js服务器提供文件下载,并且做了很棒的工作。它可以进行限制,可以在几个小时内完成下载并且无任何问题。这是通过直接连接到node.js端口来测试的,该端口当前仍然绑定到外部互联网。但是,我想改变它,所以我需要让nginx处理代理。在节点之前,我们有一个PHP脚本来提供相同的下载功能,这个脚本运行几个小时没有问题(同时吸收主要资源并且在服务器崩溃时),都在nginx之后。

所以,我将文件下载位置do proxy更改为node.js并设置,我认为是允许无限长度下载的超时值。

location ~ ^(/my/download/.*)$ {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_pass http://127.0.0.1:1337$1$is_args$args;

  send_timeout 12h;
  proxy_read_timeout 12h;
  proxy_send_timeout 12h;
}

我相信这些数值可能低至60秒甚至更低,因为在阅读或发送之间的时间(根据nginx文档),而不是总数。由于下载不断获取新数据,因此低值时应该没问题。但是,由于它不起作用,我想确保这不是问题。我没有添加连接超时,因为node.js在localhost上,因此连接时间应该可以忽略不计(除非节点忙,我知道它不是)。

由于某些未知原因,nginx认为这次下载确实耗费太长时间并且只是切断了连接。我知道这一点,因为只要从等式中删除nginx,一切都会永远有效。

为什么nginx超时,或者出于其他原因断开连接?我检查了日志,没有错误(也许我可以设置一些选项来记录超时?)。

我很快就扯掉了我的头发......

编辑:以下是一次失败下载的调试日志的结束:     2013/10/23 21:37:27 [debug] 23708#0:* 21 recv:fd:32-1 of 4096     2013/10/23 21:37:27 [debug] 23708#0:* 21 recv()未就绪(11:资源暂时不可用)     2013/10/23 21:37:27 [debug] 23708#0:* 21 event timer:32,old:1382596647084,new:1382596647364     2013/10/23 21:37:27 [debug] 23708#0:* 21 post event 00007F73AD1ED558     2013/10/23 21:37:27 [debug] 23708#0:* 21 post event 00007F73AD0EF558     2013/10/23 21:37:27 [debug] 23708#0:* 21删除发布的事件00007F73AD0EF558     2013/10/23 21:37:27 [debug] 23708#0:* 21 http上游请求:“/ my /download / somefile.huge?”     2013/10/23 21:37:27 [debug] 23708#0:* 21 http上游虚拟处理程序     2013/10/23 21:37:27 [debug] 23708#0:* 21删除发布的事件00007F73AD1ED558     2013/10/23 21:37:27 [debug] 23708#0:* 21 http上游请求:“/ my /download / somefile.huge?”     2013/10/23 21:37:27 [debug] 23708#0:* 21 http上游进程非缓冲上游

******************************

2013/10/23 21:37:27 [debug] 23708#0: *21 recv: fd:32 4096 of 4096
2013/10/23 21:37:27 [debug] 23708#0: *21 http output filter "/my/download/somefile.huge?"
2013/10/23 21:37:27 [debug] 23708#0: *21 http copy filter: "/my/download/somefile.huge?"
2013/10/23 21:37:27 [debug] 23708#0: *21 image filter
2013/10/23 21:37:27 [debug] 23708#0: *21 xslt filter body
2013/10/23 21:37:27 [debug] 23708#0: *21 http postpone filter "/my/download/somefile.huge?" 0000000000EDDC00
2013/10/23 21:37:27 [debug] 23708#0: *21 write new buf t:0 f:0 0000000000000000, pos 0000000000EDC610, size: 4096 file: 0, size: 0
2013/10/23 21:37:27 [debug] 23708#0: *21 http write filter: l:0 f:1 s:4096
2013/10/23 21:37:27 [debug] 23708#0: *21 http write filter limit 0
2013/10/23 21:37:27 [debug] 23708#0: *21 writev: 4096
2013/10/23 21:37:27 [debug] 23708#0: *21 http write filter 0000000000000000
2013/10/23 21:37:27 [debug] 23708#0: *21 http copy filter: 0 "/my/download/somefile.huge?"

******************************

2013/10/23 21:37:27 [debug] 23708#0: *21 recv: fd:32 -1 of 4096
2013/10/23 21:37:27 [debug] 23708#0: *21 recv() not ready (11: Resource temporarily unavailable)
2013/10/23 21:37:27 [debug] 23708#0: *21 event timer del: 32: 1382596647084
2013/10/23 21:37:27 [debug] 23708#0: *21 event timer add: 32: 43200000:1382596647404
2013/10/23 21:37:27 [debug] 23708#0: *21 post event 00007F73AD1ED558
2013/10/23 21:37:27 [debug] 23708#0: *21 post event 00007F73AD0EF558
2013/10/23 21:37:27 [debug] 23708#0: *21 delete posted event 00007F73AD0EF558
2013/10/23 21:37:27 [debug] 23708#0: *21 http upstream request: "/my/download/somefile.huge?"
2013/10/23 21:37:27 [debug] 23708#0: *21 http upstream dummy handler
2013/10/23 21:37:27 [debug] 23708#0: *21 delete posted event 00007F73AD1ED558
2013/10/23 21:37:27 [debug] 23708#0: *21 http upstream request: "/my/download/somefile.huge?"
2013/10/23 21:37:27 [debug] 23708#0: *21 http upstream process non buffered upstream

******************************

2013/10/23 21:37:27 [debug] 23708#0: *21 recv: fd:32 4096 of 4096
2013/10/23 21:37:27 [debug] 23708#0: *21 http output filter "/my/download/somefile.huge?"
2013/10/23 21:37:27 [debug] 23708#0: *21 http copy filter: "/my/download/somefile.huge?"
2013/10/23 21:37:27 [debug] 23708#0: *21 image filter
2013/10/23 21:37:27 [debug] 23708#0: *21 xslt filter body
2013/10/23 21:37:27 [debug] 23708#0: *21 http postpone filter "/my/download/somefile.huge?" 0000000000EDDC00
2013/10/23 21:37:27 [debug] 23708#0: *21 write new buf t:0 f:0 0000000000000000, pos 0000000000EDC610, size: 4096 file: 0, size: 0
2013/10/23 21:37:27 [debug] 23708#0: *21 http write filter: l:0 f:1 s:4096
2013/10/23 21:37:27 [debug] 23708#0: *21 http write filter limit 0
2013/10/23 21:37:27 [debug] 23708#0: *21 writev: 4096
2013/10/23 21:37:27 [debug] 23708#0: *21 http write filter 0000000000000000
2013/10/23 21:37:27 [debug] 23708#0: *21 http copy filter: 0 "/my/download/somefile.huge?"

******************************

2013/10/23 21:37:27 [debug] 23708#0: *21 recv: fd:32 -1 of 4096
2013/10/23 21:37:27 [debug] 23708#0: *21 recv() not ready (11: Resource temporarily unavailable)
2013/10/23 21:37:27 [debug] 23708#0: *21 event timer: 32, old: 1382596647404, new: 1382596647444

* ****用于分隔块(因此更容易看到它们) 正如您所看到的,没有任何迹象表明节奏有任何变化(没有额外的计时器事件等)。

此外,在不同的下载中,日志的结尾是:

2013/10/23 21:21:25 [debug] 11960#0: *33 image filter
2013/10/23 21:21:25 [debug] 11960#0: *33 xslt filter body
2013/10/23 21:21:25 [debug] 11960#0: *33 http postpone filter "/my/download/somefile.huge?" 000000000122F2F0
2013/10/23 21:21:25 [debug] 11960#0: *33 write new buf t:0 f:0 0000000000000000, pos 000000000122DD00, size: 4096 file: 0, size: 0
2013/10/23 21:21:25 [debug] 11960#0: *33 http write filter: l:0 f:1 s:4096
2013/10/23 21:21:25 [debug] 11960#0: *33 http write filter limit 0
2013/10/23 21:21:25 [debug] 11960#0: *33 writev: 4096
2013/10/23 21:21:25 [debug] 11960#0: *33 http write filter 0000000000000000
2013/10/23 21:21:25 [debug] 11960#0: *33 http copy filter: 0 "/my/download/somefile.huge?"
2013/10/23 21:21:25 [debug] 11960#0: *33 recv: fd:22 -1 of 4096
2013/10/23 21:21:25 [debug] 11960#0: *33 recv() not ready (11: Resource temporarily unavailable)
2013/10/23 21:21:25 [debug] 11960#0: *33 event timer del: 22: 1382595684239
2013/10/23 21:21:25 [debug] 11960#0: *33 event timer add: 22: 43200000:1382595685518
2013/10/23 21:21:25 [debug] 11960#0: *33 post event 00007F9FD73D93B8
2013/10/23 21:21:25 [debug] 11960#0: *33 delete posted event 00007F9FD73D93B8
2013/10/23 21:21:25 [debug] 11960#0: *33 http upstream request: "/my/download/somefile.huge?"
2013/10/23 21:21:25 [debug] 11960#0: *33 http upstream dummy handler

请注意,在此下载中,我从node.js发送到nginx的块大小为128k,因此在发生延迟之前,recv将连续多次成功。但是,recv返回-1应该是正常的,这只是意味着nginx必须等待几个ms才能进行下一个块(下载会受到限制,因此存在故意的内置延迟)。

这里奇怪的是2个下载日志有不同的结局:128k块下载以“http上游虚拟处理程序”结束,但4k块下载以“事件定时器:32,......”结束。 / p>

我仍然不知道为什么nginx会阻止它。如果我与客户端断开连接,nginx将在日志中显示错误:“客户端断开连接,不确定他在想什么”或类似的东西。这告诉我的是nginx没有断开连接,因为它认为客户端停止了。此外,没有迹象表明它已停止,因为它认为node.js没有响应。

如果有人知道这可能是什么,请分享。

编辑:似乎nginx正在重启。我看到下载失败后主进程的pid有所不同。还在调查原因。

0 个答案:

没有答案