我正在运行一个接受大文件上传的应用程序,但也应该允许用户在上传进行时向同一个应用程序发出其他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不会抛出错误,而是将请求挂起,直到超时为止。
非常感谢任何帮助。
答案 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