10

我们的 Web 服务器(配置为 ssl -> apache -> jetty)出现问题,随机拒绝分段上传 POST 请求,错误代码为 400 Bad Request。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 错误请求。有时我们的码头服务器甚至没有看到请求意味着它在 apache 端被拒绝,有时它开始处理它只是被拒绝(这在我们的 UploadFilter 中表现为 MultipartException)

我们设置了 mod_proxy 以使用回退负载平衡方案,但日志显示尚未触发回退,导致我相信这不是问题的原因。

我尝试设置 SetEnv proxy-sendcl 1 但这并没有改变任何东西。

上传请求约为 1mb。只有这些多部分文件 POST 请求失败,我们有多个 GET 请求同时进入,它们总是按预期工作。

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

4

4 回答 4

2

如果您使用一些启用了 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 连接器。

希望能帮助到你!

于 2015-05-08T13:41:25.877 回答
1

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

该问题可能是由 HTTP 保持连接(KeepAliveTimeout 指令)导致与慢速客户端建立的连接(tcp 延迟、缓慢的请求正文创建等)造成的。

尝试在您的 apache conf 中提高 KeepAliveTimeout,但不要将其保持得太高以避免杀死您的服务器 (DOS)。

于 2012-12-18T15:55:06.883 回答
1

您可能会因为 Apache尝试在传递整个 POST 正文之前缓冲整个 POST 正文而导致超时而看到这一点。

启用proxy-sendcl可能会加剧这种情况,因为这可能会迫使 Apache 将一个大的 POST 假脱机到磁盘,只是为了在“原始正文是使用分块编码发送(并且很大)”时计算 Content-Length 。

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

于 2019-12-11T20:52:18.793 回答
0

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

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

通过增加 mod_reqtimeout 的限制,改变RequestReadTimeout参数的值,我能够大大降低它发生的频率。您可以更改默认值或在VirtualHost.

于 2015-05-08T13:46:48.403 回答