【问题标题】:How to make a chunked request via nginx如何通过 nginx 发出分块请求
【发布时间】:2012-01-21 15:37:48
【问题描述】:

看来 nginx 对分块请求的支持不是很好。但我试图得到一个更明确(和当前)的答案。我有一个客户端从 Java 客户端向服务器发出 SOAP 请求,该请求设置了标头 Transfer-Encoding: chunked。当我直接连接到 Tomcat 上的应用程序时,一切正常。

但是当我把 nginx 放在它们之间时,事情就坏了。

添加一些细节:我正在使用 CloudFoundry。我正在使用 Micro Cloud Foundry 来确认在没有 nginx 的情况下事情是否按预期工作。但是我的要求是使用cloudfoundry.com,所以我没有能力绕过那里的nginx。

This question and answer 说这可能是我唯一的解决方法:http://wiki.nginx.org/NginxHttpChunkinModule。但该解决方法不可用,因为我无法修改 cloudfoundry.com 上的配置。

This question 看起来也很相似,但它实际上涵盖了此要求的反面。它涵盖了分块响应而不是分块请求。

那么,如何对客户端进行任何更改以解决此问题?是否可以同时发送 Transfer-Encoding: chunkedContent-Length: 123 作为标题?这个领域对我来说是新的,但是从像 Apache HttpComponents 这样的项目看来,一个人可以设置长度或分块,但不能同时设置两者。分块的要点是您不需要知道请求开始时的长度。我可以告诉我的客户使用 HTTP/1.0 并在不分块的情况下与 nginx 一起玩吗?还有其他我忘记的解决方法吗?

【问题讨论】:

    标签: java soap nginx chunked-encoding cloud-foundry


    【解决方案1】:

    我已经收集了这个问题所有部分的答案。

    Base nginx 不支持分块请求(正如 Alexander 确认的那样!)。 Nginx 可以通过使用NginXHttpCunkinModule 来支持分块请求(正如我的问题所提到的)。更好:这个模块在 18 个多月前从 beta 状态升级到生产质量。最佳:我最近在meetup 上与 CloudFoundry 工程团队的一些成员进行了交谈;他们确认计划将此模块添加到他们的 nginx 版本中。问题解决了。 (嗯,从长远来看,它已经完全解决了。但我们没有确切的日期来预测何时会发生这种情况。)

    因此,短期解决方案也不错。我找到了一个。

    回答我向 Alexander 提出的问题:无法使用分块消息发送“Content-Length”。这就是分块消息的真正意义:您在获得完整内容之前就开始发送它们,因此您可能还不知道长度。所以他避免分块请求的想法是正确的。但为了更实用,我会说“使用 HTTP/1.0 而不是 HTTP/1.1”。这具有不发送分块消息的效果。我们能够临时修补我们的客户来测试这个想法。有效。但我们不打算推出公共补丁。让每个人都使用十年前的协议(以及十年前不受支持的客户端库!)来解决这种情况的问题似乎适得其反。

    我会在需要时使用被黑客户端,如果其他人需要它,我会通过电子邮件发送,我们将等待 CloudFoundry 更新到 HttpChunkin 和 HTTP/1.1。

    【讨论】:

      【解决方案2】:

      Nginx 确实不支持分块请求。如果没有 Content-Length 标头,它将返回 411 Content Length required

      由于您正在控制您的客户端代码,我想唯一的选择是避免使用分块请求并明确指定 Content-Length

      【讨论】:

      • 是否可以同时发送 Transfer-Encoding: chunked 和 Content-Length: 123 作为标头?很常见吗?
      猜你喜欢
      • 2018-12-17
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2016-09-11
      相关资源
      最近更新 更多