5

我有一个 nginx 服务器,它提供文件,向 php 发送请求,还代理到 node.js 后端服务器。这个 node.js 服务器提供文件下载,并且做得很棒。它会进行节流,并且可以毫无问题地持续下载数小时。这是通过直接连接到 node.js 端口进行测试的,该端口目前仍绑定到外部互联网。但是,我想改变它,所以我需要让 nginx 处理代理。在 node 之前,我们有一个 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 在本地主机上,所以连接时间应该可以忽略不计(除非节点很忙,我知道它不是)。

由于某些未知的原因,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 [调试] 23708#0:*21 recv() 未准备好(11:资源暂时不可用)2013/10/23 21:37:27 [调试]23708#0:*21 事件计时器:32,旧:1382596647084,新: 1382596647364 2013/10/23 21:37:27 [调试] 23708#0: *21 发布事件 00007F73AD1ED558 2013/10/23 21:37:27 [调试] 23708#0: *21 发布事件 00007F73AD/EF558 2013 23 21:37:27 [调试] 23708#0: *21 删除已发布的事件 00007F73AD0EF558 2013/10/23 21:37:27 [调试] 23708#0: *21 http 上游请求:“/my/download/somefile.巨大的?” 2013/10/23 21:37:27 [调试] 23708#0: *21 http 上游虚拟处理程序 2013/10/23 21:37:27 [调试] 23708#0: *21 删除已发布的事件 00007F73AD1ED558 2013/10/ 23 21:37:27 [调试] 23708#0:* 21 http 上游请求:“/my/download/somefile.huge?” 2013/10/23 21:37:27 [调试] 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 必须等待几毫秒才能等待下一个块(下载被限制,因此有故意的内置延迟)。

这里奇怪的是,2个下载日志有不同的结尾:128k块下载以“http upstream dummy handler”结束,但4k块下载以“event timer: 32, ....”结束

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

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

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

4

0 回答 0