2012-10-21 87 views
7

我們的Web服務器(配置ssl - > apache - > jetty)隨機拒絕帶有400錯誤請求錯誤代碼的分段上傳POST請求。 Apache的錯誤日誌(信息級別)顯示以下兩個錯誤:Apache多部分POST「傳遞請求主體失敗」

[info] [client x1.y1.z1.w1] (70007)The timeout specified has expired: SSL input filter read failed. 
[error] proxy: pass request body failed to x.y.z.w:8087 from x1.y1.z1.w1 
[info] [client x1.y1.z1.w1] Connection closed to child 74 with standard shutdown 

[info] [client x2.y2.z2.w2] (70014)End of file found: SSL input filter read failed. 
[error] proxy: pass request body failed to x.y.z.w:8087 from x2.y2.z2.w2 
[info] [client x2.y2.z2.w2] Connection closed to child 209 with standard shutdown 

兩種情況下,從一個400錯誤請求的客戶端造成的。有時候我們的碼頭服務器甚至沒有看到請求意味着它在apaches方面被拒絕,有時它開始處理它只是被拒絕(這在我們的UploadFilter中表現爲MultipartException)

我們有mod_proxy安裝程序來使用一個回退負載平衡方案,但日誌顯示回退尚未觸發,導致我相信這不是問題的原因。

我試着設置SetEnv proxy-sendcl 1但沒有改變任何東西。

上傳請求爲1mb。只有這些多部分文件POST請求失敗,我們有多個GET請求同時進入,並且它們始終按預期工作。

如果有人能分享任何意見或建議,我將不勝感激!謝謝

回答

1

請檢查這一個:https://issues.apache.org/bugzilla/show_bug.cgi?id=44592

這個問題可能由被殺滅與慢客戶端(TCP延遲,緩慢的請求主體的創建,等等)建立連接的HTTP保持活動(的KeepAliveTimeout指令)引起的。

嘗試在您的apache conf中提高KeepAliveTimeout,但不要讓它過高以免殺死您的服務器(DOS)。

1

如果您正在使用一些支持ajp的後端服務器(如Tomcat),則可以嘗試使用mod_proxy_ajp而不是mod_proxy_http。我有一個沉重的上傳應用了類似的問題,我固定它通過改變

ProxyPass /myapp http://localhost:8080/myapp 
ProxyPassReverse /myapp http://localhost:8080/myapp 

通過

ProxyPass /myapp ajp://localhost:8009/myapp 
ProxyPassReverse /myapp ajp://localhost:8009/myapp 

它也需要啓用,當然在Tomcat側AJP連接。

希望它有幫助!

+0

工作正常。謝謝。但我不確定爲什麼http代理不能在一臺特定的服務器上工作。 Httpd配置是相同的。 –

0

與上傳固定的主要問題後,我仍然得到一些奇怪的日誌,如:

[reqtimeout:info] [pid 18164:tid 140462752990976] [client 201.76.162.37:41473] AH01382: Request header read timeout 

我能夠通過增加mod_reqtimeout的限制大大減少它coccurs頻率,改變的值RequestReadTimeout參數。您可以更改默認值或在VirtualHost上重新聲明此參數。

+0

您是如何解決這個問題的? – smoes

+1

這是我對這個問題的其他答案 – BrunoJCM