4

我的设置可能看起来有点奇怪,但不应该太牵强:我有一个 apache2 实例服务器 php 页面和静态文件。我有一个POST使用node-formidable处理文件上传()的节点 js 服务器。最重要的是,我使用nginx 1.0.14. 为了使用节点服务器上传 php 文件中的表单,我决定安装 nginx,这样我就可以保持相同的域、端口和协议。所以基本上我有 /upload 我想(直接)管道到我的节点 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% 即时上传(因为它是从本地主机发送到本地主机的))。

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

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

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

  • 卡斯帕

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

4

1 回答 1

1

当前的文档明确说明该proxy_buffering指令仅影响响应而不是请求的缓冲。

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

缓冲 POST 请求所需的指令是恰当命名的proxy_request_buffering. 同样,来自当前文档

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

(对于 Casper 来说,值得注意的是该proxy_request_buffering指令是在 nginx 版本 1.7.11 中添加的,在提出这个问题几年后发布。)

于 2016-05-28T05:19:21.807 回答