node.js - 使用 nginx proxy_buffering 和 node js 强大的管道 POST 主体

标签 node.js post ssl nginx buffer

我的设置可能看起来有点奇怪,但不应该太牵强: 我有一个 apache2 实例服务器 php 页面和静态文件。我有一个 Node js 服务器使用 node-formidable 处理文件上传 (POST) .最重要的是,我使用了 nginx 1.0.14。 为了使用 Node 服务器上传 php 文件中的表单,我决定安装 nginx,这样我就可以保持相同的域、端口和协议(protocol)。 所以基本上我有/upload 我想(直接)通过管道传输到我的 Node js,最好完全在代理之外。其余的由 apache2 服务器处理:

location /upload {
    client_max_body_size        10m;
    client_body_buffer_size     128k;
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    proxy_buffer_size           4k;
    proxy_buffers               4 32k;
    proxy_busy_buffers_size     64k;
    proxy_temp_file_write_size  64k;
    send_timeout                600;
    proxy_buffering             off;
    proxy_pass https://node_backend;
}
location / {
    proxy_set_header Host $http_host;
    proxy_pass https://apache_backend;
}

基于 https://stackoverflow.com/a/1167559

我的问题是 nginx 在将其从 nginx 发送到 Node js 之前缓冲整个 POST 请求。我可以验证这一点,因为在我的 Node js 被命中之前,Chrome 中的进度指示器一直计数到 100%(从 0-100% 即时上传(因为它是从本地主机发送到本地主机的))。

我不明白为什么 proxy_buffering off 没有按照我期望的方式工作(它不应该缓冲,而是在收到请求时将请求传递给后端)。

或者...这是否可以通过其他方式实现?

非常感谢任何提示/帮助。

  • 卡斯珀

  • 注意: 我试过使用不是很广泛使用的 nginx_tcp_proxy_module。 我考虑过使用 Varnish,因为它能够做我想做的事,piping directly to node-js based on url (作者 btw 的优秀博客文章,非常值得一读),但是我正在运行一个 https 服务器(实际上是两个)所以我不确定 Varnish 是否可以做到这一点(https 不受支持,所以我必须将其包装起来,但有两个域(证书)是不可能的)

最佳答案

current docs明确 proxy_buffering 指令仅影响响应而不影响请求的缓冲。

Enables or disables buffering of responses from the proxied server.

缓冲 POST 请求所需的指令是恰当命名的 proxy_request_buffering。同样,来自 current docs :

Enables or disables buffering of a client request body.

(为了 Casper 的缘故,值得注意的是 proxy_request_buffering 指令已添加到 nginx 版本 1.7.11 中,已发布 several years after 问了这个问题。)

关于node.js - 使用 nginx proxy_buffering 和 node js 强大的管道 POST 主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10056214/

相关文章:

javascript - Meteor.js Cordova 错误 : ERROR whitelist rejection

angularjs - 直接在前端自动更新 mongodb 中的更改,无需使用 Node Socket.io 和 angularjs 刷新页面

javascript - KOA2+node+ejs错误: Can't set headers after they are sent

delphi - 在 Delphi 中使用 idHTTP 发布表单数据

json - 如何更新json文件中的值并通过node.js保存

php - 使用 shell_exec 从 PHP 中调用 Python

php - 如何在没有内存开销的情况下在 PHP curl 中 POST 大量数据?

c - OpenSSL - 在证书链中查找错误深度

amazon-web-services - 将 QuoVadis EV 证书上传到 AWS

mongodb - 如何使用无效的 Tls 证书连接 Rust MongoDB 驱动程序?