我正在运行一个简单的服务器应用程序来接收来自精细 uploader 网络客户端的上传。它基于 fine-uploader Java 示例,在 Tomcat6 中运行,Apache 位于它前面,并使用 ProxyPass 来路由请求。我偶尔会遇到上传达到 100% 但最终失败的问题。在服务器日志以及客户端上,我可以看到 Apache 在代理上超时并出现 502 错误。
在亲自尝试并看到这个之后,我意识到这个问题出现在非常大的文件上。 Java 服务器应用程序花费超过 30 秒的时间将 block 重新组合成单个文件,因此 Apache 将终止连接并停止等待。我已将 Apache 超时增加到 300 秒,这应该可以在很大程度上解决问题,但潜力仍然存在。
关于处理此问题的其他方法的任何想法,以便在应用程序在服务器上组装 block 时 Apache 和 Tomcat 之间的连接不会被终止?我目前正在使用 2 MB 的 block ,并且在想也许我应该使用更大的 block 大小。也许用更少的 block 来组装服务器代码可以更快地完成。我可以对此进行测试,但除非加速非常显着,否则问题的可能性似乎仍然存在,并且只会等待足够大的上传来触发它们。
最佳答案
看起来你有两个选择:
- 删除 Apache 中的超时。
- 将 block 组合工作委托(delegate)给单独的线程,并尽快返回对请求的响应。
使用后一种方法,如果 block 组合操作失败,您将无法让 Fine Uploader 知道,但也许您可以在响应之前执行一些快速的健全性检查,例如确定是否所有 block 都可访问。
这里 Fine Uploader 无能为力,问题出在服务器端。 Fine Uploader 发送请求后,它的工作就完成了,直到您的服务器响应。
正如您所提到的,增加 block 大小或进行其他更改以加快 block 组合操作以减少超时的可能性可能是合理的(如果上面的#1 或#2 不是可取的)。
关于apache - 重新组装上传文件时服务器超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23502554/