我有一个在Amazon EC2云中运行的服务器应用程序。从我的客户端(浏览器),我发出一个HTTP请求,将一个文件上传到服务器,然后服务器处理该文件。如果有很多处理(大文件 ),服务器总是在120秒后始终超时504后端延续错误。虽然我收到此错误,但服务器继续处理请求并完成它(通过检查数据库进行验证)但由于超时,我无法在客户端上看到最终结果。
我无法理解为什么会这样。有没有人遇到过类似的504超时?是否有一些不在我控制范围内的中间代理服务器超时?
答案 0 :(得分:7)
我有类似的问题,在我的情况下,我认为这是由于Elastic Load Balancer(ELB)和EC2实例之间的连接。
对于长期解决方案,我将使用上面james.garriss建议的303状态响应+后端处理。
对于短期解决方案,亚马逊支持可能会增加ELB超时(请参阅https://forums.aws.amazon.com/thread.jspa?messageID=491594񸁊中的响应)。 不幸的是,似乎没有办法通过API或控制台自行更改超时。
[更新] AWS现在允许您通过控制台,CLI或.ebextensions配置更新空闲超时。请参阅http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html(感谢@Daniel Patz的更新)
答案 1 :(得分:2)
假设正在返回正确的状态代码,问题是中间代理正在超时。 “服务器在充当网关或代理时,没有收到来自URI指定的上游服务器的及时响应。” (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5)它很可能表明原始服务器存在某种问题(即,花费很长时间来处理您的请求),所以它没有迅速作出反应。
也许最好的解决方案是重新设计您的服务器应用程序,以便它以“303 See Other”状态代码进行响应;然后,一旦服务器完成处理并创建最终结果,您的客户端就可以在以后的数据点检索数据。
编辑:另一个想法是重新设计您的服务器应用程序,以便当请求实体大小太大时,它会以“413 Request Entity Too Large”状态代码进行响应。这将消除错误,但如果它只能处理“小”文件,它可能会使你的应用程序不那么有用。“
其他可能的解决方案:
答案 2 :(得分:0)
脚本执行期间浏览器超时有可能。