小编DDS*_*DDS的帖子

为什么 nginx 会断开我的下载?(暂停?)

我有一个 nginx 服务器,它提供文件服务、向 php 发送请求,还代理到 Node.js 后端服务器。这个 Node.js 服务器提供文件下载服务,并且做得非常出色。它会进行限制,并且可以毫无问题地坚持下载几个小时。这是通过直接连接到 Node.js 端口进行测试的,该端口目前仍绑定到外部互联网。然而,我想改变这一点,所以我需要让 nginx 处理代理。在 Node 之前,我们有一个 php 脚本来提供相同的下载功能,并且该脚本运行几个小时没有问题(同时占用主要资源,有时会使服务器崩溃),所有这些都在 nginx 后面。

因此,我将文件下载位置代理更改为 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;
}
Run Code Online (Sandbox Code Playgroud)

我相信这些值可能低至 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 [debug] 23708#0: *21 recv() 未准备好 (11: 资源暂时不可用) 2013/10/23 21:37:27 [debug] 23708#0: …

proxy timeout nginx node.js

5
推荐指数
0
解决办法
3786
查看次数

标签 统计

nginx ×1

node.js ×1

proxy ×1

timeout ×1