2011-12-16 26 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