Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nginx node.js express下载大文件停止在1.08GB_Javascript_Node.js_File_Express_Nginx - Fatal编程技术网

Javascript Nginx node.js express下载大文件停止在1.08GB

Javascript Nginx node.js express下载大文件停止在1.08GB,javascript,node.js,file,express,nginx,Javascript,Node.js,File,Express,Nginx,我有这个node.js应用程序由Nginx代理(在生产中)。路线是这样的: exports.download = function(req, res){ var id = req.params.id; if (id && id == 'latest') { res.download(config.items.release_directory+'/<1.6GB-file>.zip', function(err){

我有这个node.js应用程序由Nginx代理(在生产中)。路线是这样的:

exports.download = function(req, res){

    var id = req.params.id;

    if (id && id == 'latest')
    {
        res.download(config.items.release_directory+'/<1.6GB-file>.zip', function(err){
            if (err) {
                console.log(err);
            } else {
                // do something
            }
        });
    }
    else
    {
        res.redirect(301, '/');
    }

};
编辑2: 在开发过程中,grunt直接为应用程序提供服务,而不使用Nginx,它工作得很好


已解决:请阅读下面的评论,问题是Nginx中的proxy_max_temp_file_size变量

如果在使用Nginx代理时上载文件,您可以在Nginx配置中的服务器{}块内设置“max body size”:

client_max_body_size 0; # disable any limits to avoid HTTP 413
如果您获得的是HTTP 413,请检查Nginx配置,并相应地将其设置为零或启动

否则,我会尝试增加一些超时,例如:

send_timeout 600s; # default is 60s; context: http, server, location

proxy_read_timeout 600s; # default is 60s; context: http, server, location
proxy_send_timeout 600s; # default is 60s; context: http, server, location

有关更多代理选项,请查看Nginx代理模块文档()。

此处问题在于Nginx配置,而不是nodejs代码

nginx在将临时文件发送到客户端之前先在磁盘中写入临时文件,如果站点要提供大型静态文件,通常最好禁用此缓存,例如:

location / {
    proxy_max_temp_file_size 0;
}

(无限制)

I强烈不鼓励设置
代理\u max\u temp\u file\u size 0
,因为这会删除所有端点的任何代理缓冲区

这意味着您的应用程序服务器将无法将响应数据刷新到NGINX缓冲区(下游客户端只要获得足够的连接,就可以从该缓冲区中读取)并被释放/取消阻止。相反,您的应用服务器将等待客户端(中间没有NGINX代理)下载数据

或者,您可以指示您的NGINX代理在流式传输zipfile数据时选择性地不缓冲响应数据,以避免NGINX的缓冲区tempfile变满并中断流式下载(这是我的经验)

您可以通过在Node.js端点中执行以下操作来实现这一点:

res.set('X-Accel-Buffering','no');

通过这种方式,数据将直接从Express流式传输到客户端,但仅针对您不希望缓冲响应数据的端点(很可能是您的流式传输端点))。

另一种奇怪的行为是:如果我从浏览器中单击url,则会发生这种情况,但如果我curl/wget url,则我可以完全接收文件。mmm,我想我是通过在Nginx中默认将这个参数设置为1GB的“proxy\u max\u temp\u file\u size”得到的,我想增加它就可以了。啊。。但是,如果您将
代理\u max\u temp\u file\u size
设置为。。说。。1MB,你是说你的下载也会在1MB停止吗?Nginx文档似乎暗示了这一点。我知道这可能是正确的行为,但我希望文档提供一个示例来描述大文件下载的潜在问题..确实如此,但你是对的,我不知道我现在设置的如此大的临时文件大小会发生什么。可能最好的方法是在不代理下载目录的情况下为其提供服务。实际上,这种行为要微妙得多。在我们的例子中,nodejs中默认的HTTP服务器套接字超时是两分钟。当代理临时文件填满时,nginx停止从nodejs服务器套接字读取数据,直到它将所有缓存数据交付给其HTTP客户端。如果这比nodejs HTTP服务器超时时间长,则nodejs会关闭连接nginxnodejs,nginx只需完成缓存文件中的内容,然后关闭与HTTP客户端的连接即可。因此,正确的推理方法是,使用两种默认设置(nodejs中的套接字超时为2分钟,nginx中的临时文件最大大小为1GB),如果1GB的数据不能在两分钟内传送到HTTP客户端,他们只能得到1GB的数据。这意味着降低或提高nginx中的最大临时文件大小可以解决问题!提高它以适应来自nodejs的整个响应将解决问题。同样,只要nginx可以将1MB推到其HTTP cl,将其降低到1MB也可以解决问题客户端在两分钟内!当然,禁用临时文件也会修复它。这似乎是一个令人信服的“修复”,但也打开了一扇门,通过消耗NGINX进程的所有可用内存来崩溃NGINX进程,不是吗?@Rémi Becheras
location / {
    proxy_max_temp_file_size 0;
}