2011-12-16 24 views
5

似乎nginx不太支持分块请求。但我试图得到一个更明确(和当前)的答案。我有一个客户端向设置标头Transfer-Encoding: chunked的Java客户端的服务器发出SOAP请求。当我直接连接到我在Tomcat上的应用程序时,所有工作都很好。如何通过nginx进行分块请求

但是当我把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一起玩吗?是否有其他解决方法的想法,我忘了?

回答

4

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

Base nginx不支持分块请求(就像亚历山大证实的那样!)。 Nginx可以使用NginXHttpCunkinModule支持分块请求(正如我的问题所述)。更好的是:这个模块在18个多月前从测试版状态转为生产质量测试。最佳:我最近在meetup与一些CloudFoundry工程团队的成员进行了交流;他们确认计划将此模块添加到他们的nginx版本中。问题解决了。 (嗯,这是完全从长远来看解决了。但我们没有什么时候能想到这一个确切的日期。)

因此,一个短期的解决方案将是很好的为好。我找到了一个。

回答我的问题引导到亚历山大:这是不可能送“内容长度”与分块的消息。这真的是分块的信息点:开始发送他们,你有完整的内容,因此,你不可能知道的长度呢。所以他的想法是避免分块的请求是正确的。但要更实际一些,我会说,“使用HTTP/1.0而不是HTTP/1.1”。这具有不发送分块消息的效果。我们能够暂时修补我们的客户来测试这个想法。有效。但我们不打算推出一个公共补丁。使每个人都使用一个十年的协议(和一个10年不支持的客户端库!)来解决这种情况的问题似乎适得其反。

取而代之,我会在需要时使用被黑客户端,如果其他人发现它需要,我会通过电子邮件发送出去,我们将等待CloudFoundry升级到HttpChunkin和HTTP/1.1。

2

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

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

+0

是否可以发送Transfer-Encoding:chunked和Content-Length:123作为头文件?这是常见的吗? – mdahlman 2011-12-16 15:53:30