使用nginx proxy_buffering和节点js强制管道POST主体

时间:2012-04-07 16:28:41

标签: node.js post ssl nginx buffer

我的设置可能看起来有点奇怪,但不应该太过分: 我有一个apache2实例服务器php页面和静态文件。我有一个节点js服务器使用node-formidable处理文件上传(POST)。最重要的是,我使用nginx 1.0.14。 为了使用节点服务器在php文件中提供的表单上传,我决定放置nginx,这样我就可以保持相同的域,端口和协议。 所以基本上我有/上传我想(直接)管道到我的节点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在将整个POST请求从nginx发送到节点js之前缓冲它。我可以验证这一点,因为我的节点js被点击之前Chrome中的进度指示器一直高达100%(从0-100%即时上传(因为它从localhost发送到localhost))。

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

或者......这可能以其他方式实现吗?

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

  • 卡斯帕

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

1 个答案:

答案 0 :(得分:1)

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

  

启用或禁用来自代理服务器的响应缓冲。

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

  

启用或禁用缓冲客户端请求正文。

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