【问题标题】:Nginx fails to send full file from Node/Express appNginx 无法从 Node/Express 应用程序发送完整文件
【发布时间】:2016-02-13 00:58:36
【问题描述】:

向连接速度

我的 Express.js 应用程序确定要发送哪个文件并使用 response#download 方法进行响应:

app.get('/download-the-big-file', function(request, response) {
  var file = {
    name: 'awesome.file',
    path: '/files/123-awesome.file'
  };

  response.header("X-Accel-Redirect: " + file.path);

  response.download(file.path, file.name);
});

请注意,我将 X-Accel-Redirect 标头设置为利用 NginxXsendfile

我的 Nginx 配置:

server {

    client_max_body_size 2g;
    server_name localhost;

    location / {
        proxy_pass http://127.0.0.1:8000/;
    }

    location /files {
        root /media/storage;
        internal;
    }
}

【问题讨论】:

    标签: node.js nginx express


    【解决方案1】:

    我认为最初的问题源于 Node(可能在 Node 的 I/O 循环中发送大文件),并且我认为 Nginx 正确地从 Node 获取下载的假设是不正确的。我有几个错误意味着 NginxXSendfile 没有工作,Node 仍在处理响应。

    我有一个语法错误:
    要设置响应标头,这是正确的语法:

    response.header('X-Accel-Redirect', file.path);
    

    使用上述标头时不应设置响应正文(doh!)。
    使用 Express/Connect/Node 只需 #send 带有 X-Accel-Redirect 标头的响应并使用 response#attachment 设置 Content-Disposition:

    response.attachment(file.name);
    response.send();
    

    【讨论】:

      【解决方案2】:

      除了X-Accel-Redirect之外,我还必须在响应标头中添加Content-Disposition

      Express.js 代码:

      app.get('/files/test.txt', function (req, res) {
        res.setHeader('X-Accel-Redirect', '/files/test.txt');
        res.attachment('text.txt');
        res.send();
      });
      

      Nginx 配置文件(/etc/nginx/sites-available/default)

      server {
      
          location /files {
            internal;
            root   /home/user;
          }
      }
      

      这服务于test.txt 中的文件/home/user/files(即/home/user/files/test.txt)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 2016-07-01
        • 2019-09-26
        • 1970-01-01
        • 2015-05-09
        • 2017-07-24
        • 1970-01-01
        相关资源
        最近更新 更多