禁用nginx中的请求缓冲

Uri*_*atz 8 file-upload nginx asyncfileupload gevent

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

我的情况是这样的:

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

  1. apache与典型的PHP应用程序
  2. shaveet(一个开源彗星服务器)由我用python和gevent构建
  3. 使用gevent再次构建的文件上载服务器,代理上传到rackspace云文件,同时接受来自客户端的上传.

#3是问题,现在我所拥有的是nginx缓冲所有请求,然后将其发送到文件上传服务器,后者又将其发送到云文件,而不是在获取它时发送每个块(那些使得上传速度更快)我可以将6-7MB/s推送到cloudfiles).

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

van*_*ome 9

一旦实现了这个[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


sca*_*ape 5

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

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

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


小智 5

从 nginx-1.7.11 版本开始,现在可在 nginx 中使用。

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

要禁用缓冲上传指定

proxy_request_buffering off;
Run Code Online (Sandbox Code Playgroud)