禁用nginx中的请求缓冲

时间:2011-05-11 10:56:26

标签: file-upload nginx asyncfileupload gevent

似乎nginx在将请求传递给updstream服务器之前缓冲请求,而对于我来说大多数情况都可以,这非常糟糕:)

我的情况是这样的:

我有nginx作为代理3个不同服务器的前端服务器:

  1. 带有典型php应用程序的apache
  2. shaveet(一个开源彗星服务器)由我用python和gevent构建
  3. 使用gevent再次构建文件上传服务器,代理上传到rackspace云文件 同时接受来自客户的上传。
  4. #3是问题,现在我所拥有的是nginx缓冲所有请求,然后将其发送到文件上传服务器,后者又将其发送到云文件,而不是在获取它时发送每个块(那些使得它上传速度更快,因为我可以将6-7MB / s推送到云文件。)

    我使用nginx的原因是如果我不能这样做,就有3个不同的域和一个IP我将不得不将fileupload服务器移动到另一台机器。

4 个答案:

答案 0 :(得分:8)

只要实现了这个[1]功能,Nginx就可以充当反向代理而无需缓冲上传(错误客户端请求)。 它应该落在1.7当前的主线上。

[1] http://trac.nginx.org/nginx/ticket/251

更新

此功能自1.7.11以来通过标志

可用

proxy_request_buffering on | off;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering

答案 1 :(得分:3)

根据Gunicorn,他们建议您使用nginx实际缓冲客户端并防止slowloris攻击。所以这种缓冲可能是一件好事。但是,我确实在我提供的关于删除代理缓冲区的链接上看到了一个选项,不清楚它是否在nginx内,但它看起来好像是。当然,这是假设你有Gunicorn跑,你没有。也许这对你有用。

编辑:我做了一些研究,nginx中的缓冲区禁用用于出站长轮询数据。 Nginx在其wiki站点上声明入站请求必须在上游发送之前进行缓冲。

  

“请注意,在使用HTTP代理模块时(甚至在使用FastCGI时),整个客户端请求将在nginx中缓冲,然后再传递到后端代理服务器。因此,上传进度表将无法正常运行如果他们通过测量后端服务器收到的数据来工作。“

答案 2 :(得分:1)

现在可以在nginx中使用,因为版本为nginx-1.7.11。

参见文档 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering

要禁用缓冲上传指定

{{1}}

答案 3 :(得分:0)

我会考虑使用haproxy来满足这种需求。