禁用Nginx中的请求缓存

11

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

我的情况如下:

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

  1. 使用典型 php 应用的 apache 服务器
  2. 由我自己用 python 和 gevent 构建的开源 comet 服务器 shaveet
  3. 再次使用 gevent 构建的文件上传服务器,它可以代理上传到 rackspace cloudfiles 的数据,同时接受来自客户端的上传。

#3 是问题所在,目前我遇到的问题是 nginx 缓存所有请求,然后将其发送到文件上传服务器,最终由该服务器再将其发送到 cloudfiles,而不是在获得每个块时立即将其发送(这样可以加快上传速度,因为我可以将 6-7MB/s 的数据推送到 cloudfiles)。

我使用 nginx 的原因是要在一个 IP 下拥有三个不同的域名,如果不能做到这一点,我就必须将文件上传服务器移到另一台机器上。


4
就让大家知道,根据 #nginx 和 #lighttpd 的人们所说,无法在它们两个上禁用请求缓冲。 :( - Uriel Katz
对于你的第三个问题,你是否使用了 gevent 1.0 之前内置的 http 服务器支持?最新版本的 gevent 只支持 wsgi,不再支持 http,所以我想知道该用什么。我猜可以使用 Django... - André Cruz
1
如果您的服务器可以分配多个IP,则可以将专用上传服务器绑定到第二个IP。其结果是您需要为其提供单独的主机名,这可能会导致客户端的跨域策略问题。 - gertas
4个回答

14

1
版本1.7.11于2015年3月24日发布,带来了这个功能。 - basbebe

5

5
根据Gunicorn的建议,他们建议您使用nginx来缓冲客户端并防止慢速攻击。因此,这种缓冲很可能是一件好事。然而,在我提供的链接中,我看到了一个更深入的选项,它谈到了删除代理缓冲区,不清楚这是否在nginx中,但看起来似乎是。当然,这是在假定您正在运行Gunicorn的情况下,而您没有运行。也许对您仍有用。

编辑:我进行了一些研究,发现nginx中的缓冲禁用是针对出站的长轮询数据的。Nginx在其wiki网站上指出,必须在将传入请求发送到上游之前对其进行缓冲。

"请注意,当使用HTTP代理模块(甚至使用FastCGI)时,整个客户端请求都将在nginx中缓冲,然后再传递给后端代理服务器。因此,如果上传进度条通过测量后端服务器接收的数据来工作,则不会正确地工作。"


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

HA代理不支持SSL,除此之外据我所知它只处理保持活动会话中的第一个请求头。 - gertas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接