我的设置可能看起来有点奇怪,但不应该太牵强:
我有一个 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/