【问题标题】:disable request buffering in nginx在 nginx 中禁用请求缓冲
【发布时间】:2011-08-23 05:08:36
【问题描述】:

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

我的情况是这样的:

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

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

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

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

【问题讨论】:

  • 大家都知道,根据 #nginx 和 #lighttpd 中的 ppl ,不可能在它们两个上禁用请求缓冲:(
  • 对于您的#3,您是否使用了 gevent
  • 如果您的服务器可以分配多个 IP,则可以将专用上传服务器绑定到第二个 IP。结果是您需要单独的主机名,这可能会导致客户端出现跨域策略问题。

标签: file-upload nginx asyncfileupload gevent


【解决方案1】:

一旦实现了这个 [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 年 3 月 24 日发布的 1.7.11 版本带来了此功能
【解决方案2】:

自 nginx-1.7.11 版本起现在可在 nginx 中使用。

查看文档 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering

要禁用缓冲上传指定

proxy_request_buffering off;

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • HA 代理不支持 SSL,除此之外,AFAIK 仅在保活会话中处理第一个请求的标头。
      猜你喜欢
      • 2017-02-15
      • 2020-12-03
      • 2018-04-17
      • 1970-01-01
      • 2021-12-28
      • 2021-04-02
      • 1970-01-01
      • 2021-02-22
      • 2012-08-23
      相关资源
      最近更新 更多