10

似乎 nginx 在将请求传递给上游服务器之前会对其进行缓冲,虽然在大多数情况下对我来说都可以,但它非常糟糕:)

我的情况是这样的:

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

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

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

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

4

4 回答 4

12

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

于 2015-01-20T22:07:04.943 回答
5

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

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

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

于 2012-09-05T19:30:54.947 回答
4

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

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

要禁用缓冲上传,请指定

proxy_request_buffering off;
于 2015-04-23T15:28:48.880 回答
-1

我会研究 haproxy 来满足这个需求。

于 2011-06-30T10:18:08.083 回答