Apache multipart POST“传递请求体失败”

时间:2012-10-21 23:34:07

标签: apache https jetty multipart mod-proxy

我们的网络服务器(配置为ssl - > apache - > jetty)随机拒绝带有400 Bad Request错误代码的多部分上传POST请求。 apache错误日志(在信息级别上)显示以下两个错误:

[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 Bad Request中的客户端。有时我们的jetty服务器甚至看不到请求意味着它在apaches端被拒绝,有时它开始处理它只是被拒绝(这在我们的UploadFilter中表现为MultipartException)

我们有mod_proxy设置使用后备负载平衡方案但日志显示还没有触发回退导致我相信这不是问题的原因。

我尝试设置SetEnv proxy-sendcl 1,但没有改变任何内容。

上传请求数量为1mb。只有这些多部分文件POST请求失败,我们有多个GET请求同时进入,并且它们始终按预期工作。

如果有人可以分享任何意见或建议,我将非常感激!谢谢

4 个答案:

答案 0 :(得分:1)

请检查一下:https://issues.apache.org/bugzilla/show_bug.cgi?id=44592

问题可能是由于HTTP keepalive(KeepAliveTimeout指令)导致与慢客户端建立连接(tcp延迟,创建慢请求主体等)。

尝试在你的apache conf中提升KeepAliveTimeout,但不要让它太高以避免杀死你的服务器(DOS)。

答案 1 :(得分: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连接器。

希望它有所帮助!

答案 2 :(得分:1)

由于Apache trying to buffer the entire POST body before passing it through导致的超时,您可能会看到此错误。

启用proxy-sendcl可能会加剧这种情况,因为这可能迫使Apache将大型POST假脱机到磁盘,只是为了计算"the original body was sent with chunked encoding (and is large)"时的Content-Length。

为避免这种情况,请设置环境变量proxy-sendchunked

答案 3 :(得分:0)

在解决了上传的主要问题后,我仍然得到一些奇怪的日志,如:

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

通过增加mod_reqtimeout的限制,更改了RequestReadTimeout参数的值,我能够大幅降低它的频率。您可以更改VirtualHost上的默认值或重新声明此参数。