重新组装上传文件时服务器超时
Posted
技术标签:
【中文标题】重新组装上传文件时服务器超时【英文标题】:Server timeout when re-assembling the uploaded file 【发布时间】:2014-06-23 12:43:53 【问题描述】:我正在运行一个简单的服务器应用程序来接收来自精细上传 Web 客户端的上传内容。它基于 Fine-uploader Java 示例并在 Tomcat6 中运行,Apache 位于其前面并使用 ProxyPass 来路由请求。我偶尔会遇到上传达到 100% 但最终失败的问题。在服务器日志以及客户端上,我可以看到 Apache 在代理上超时并出现 502 错误。
在亲自尝试并看到这个之后,我意识到问题出现在非常大的文件中。 Java 服务器应用程序需要超过 30 秒的时间将这些块重新组合成一个文件,因此 Apache 会终止连接并停止等待。我已将 Apache Timeout 增加到 300 秒,这应该可以在很大程度上纠正问题,但潜力仍然存在。
关于处理此问题的其他方法的任何想法,以便在应用程序在服务器上组装块时不会终止 Apache 和 Tomcat 之间的连接?我目前正在使用 2 MB 的块,并且在想也许我应该使用更大的块大小。也许用更少的块来组装服务器代码可以做得更快。我可以对此进行测试,但除非加速非常显着,否则问题的可能性似乎仍然存在,只是等待足够大的上传来触发它们。
【问题讨论】:
Bad Gateway 502 error with Apache mod_proxy and Tomcat 的可能重复项 我不这么认为。我明白为什么会发生超时,我正在向 Fineuploader 询问避免它的策略。假设服务器确实需要 10 分钟来从它发送的所有块中组装一个文件,如果没有将超时配置为 > 10 分钟,那么客户端和服务器连接如何更改? 使用 Fine Uploader 所能做的就是改变区块大小。问题显然出在服务器上。 @Ray 下面没有提到的另一个选项是使用 Fine Uploader S3。 S3 是一种可扩展、可用且低延迟的数据存储,根据我的经验,在组合甚至多 GB 文件的块时它超时的可能性非常低。 【参考方案1】:看来你有两个选择:
-
删除 Apache 中的超时。
将块组合工作委托给单独的线程,并尽快返回对请求的响应。
使用后一种方法,如果块组合操作失败,您将无法让 Fine Uploader 知道,但也许您可以在响应之前执行一些快速的健全性检查,例如确定是否所有块都可以访问。
Fine Uploader 在这里无能为力,问题出在服务器端。 Fine Uploader 发送请求后,它的工作就完成了,直到您的服务器响应。
正如您所提到的,增加块大小或进行其他更改以加快块组合操作以减少超时的机会可能是合理的(如果上面的#1 或#2 是不可取的)。
【讨论】:
我不认为你可以删除超时,只能让它不切实际地高。这是我或多或少期待的答案,只是在寻找确认。以上是关于重新组装上传文件时服务器超时的主要内容,如果未能解决你的问题,请参考以下文章