2012-10-21 59 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