通过NGINX上传二进制流阻止对Node.js应用程序的所有其他POST请求

时间:2017-08-18 18:23:21

标签: node.js nginx

我正在运行一个接受大文件上传的应用程序,但也应该允许用户在上传进行时向同一个应用程序发出其他POST请求。

应用程序在node.js上运行,上传由formidable和s3stream处理,直接将二进制内容流式传输到S3而不使用服务器上的磁盘空间。

看起来这是一个NGINX配置问题,因为其他一切在本地工作得很好。

我当前的NGINX配置如下所示:

server {
    listen 443 ssl http2;
    server_name upload.app.io;
    underscores_in_headers on;

    location / {
        proxy_request_buffering off;
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    ssl_certificate /etc/nginx/ssl/ca-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
}

那么为什么NGINX会在上传过程中阻止任何并行POST请求,我该如何解决这个问题呢?

为了澄清,NGINX不会抛出错误,而是将请求挂起,直到超时为止。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我已经找到了解决问题的方法。它可能不是最好的做法,但它适用于我需要的东西。

我现在使用两个单独的位置块来处理请求。一个用于文件上传,另一个用于其他一切。通过这种方式,我可以使用/ upload块而无需通过应用直接流式传输到S3的缓冲,并让/ block通常使用缓冲区来处理所有其他请求。

这是配置:

server {
    listen 443 ssl http2;
    server_name upload.app.io;
    underscores_in_headers on;

    location /upload {
        client_max_body_size 0;
        proxy_request_buffering off;
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    ssl_certificate /etc/nginx/ssl/ca-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
}

答案 1 :(得分:-1)

client_max_body_size 10m; enter link description here