【问题标题】:Apache multipart POST "pass request body failed"Apache multipart POST“传递请求正文失败”
【发布时间】:2012-10-11 18:45:46
【问题描述】:

我们的 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 请求同时进入,它们总是按预期工作。

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

【问题讨论】:

    标签: apache https jetty multipart mod-proxy


    【解决方案1】:

    您可能会因为 Apache trying to buffer the entire POST body before passing it through 导致超时而看到此问题。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这是我对这个问题的另一个答案
      【解决方案3】:

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

      希望对你有帮助!

      【讨论】:

      • 效果很好。谢谢。但我不确定为什么 http 代理不能在一台特定的服务器上运行。 Httpd配置相同。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 2013-02-08
        • 2013-03-21
        • 1970-01-01
        • 2020-05-11
        • 2011-05-27
        • 1970-01-01
        相关资源
        最近更新 更多