【问题标题】:How to ignore idle timeout from AWS ELB in the browser如何在浏览器中忽略来自 AWS ELB 的空闲超时
【发布时间】:2018-07-16 13:42:36
【问题描述】:

我有一个应用程序,用户可以使用 angular-file-upload.js 上传 PDF

此库不支持文件分块:https://github.com/nervgh/angular-file-upload/issues/41

我的弹性负载均衡器配置为具有 10 秒的空闲超时,应用程序的其他部分取决于保留此参数。

问题是,如果文件上传时间超过 10 秒,用户会在浏览器中收到 504 网关超时和错误消息。但是,文件仍然会在一段时间后到达服务器。

如何忽略或不向用户显示来自 ELB 的 504 网关超时?有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: angularjs amazon-web-services file-upload amazon-elb


    【解决方案1】:

    您遇到的问题是 ELB 总是会关闭连接,除非它从您的服务器获取一些流量。请参阅以下来自 AWS docs 的内容。这对于 ALB 或 Classic 负载均衡器的行为相同。

    默认情况下,Elastic Load Balancing 将空闲超时设置为 60 秒 对于这两个连接。因此,如果实例不发送一些 在请求进行期间至少每 60 秒发送一次数据, 负载均衡器可以关闭连接。为确保冗长 文件上传等操作有时间完成,至少发送1 每个空闲超时时间过去之前的字节数据,并增加 空闲超时时间长度根据需要而定。

    所以要解决这个问题,您有两种选择:

    1. 将服务器处理更改为在连接建立后立即开始发回一些数据,间隔小于 10 秒。
    2. 使用其他库进行上传,或使用原版 javascript。那里有很多例子,例如this one

    编辑: 第三个选项 感谢@colde 提出的有效观点,即您可以简单地完全围绕负载均衡器工作。这有一个额外的好处,那就是释放您的服务器资源,这些资源与冗长的上传有关。在我们的实现中,我们使用pre-signed urls 来安全地实现这一目标。

    【讨论】:

    • 如果文件无论如何都要放在 S3 上,使用 docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html 之类的东西也可能是一个解决方案。这完全绕过了负载均衡器。
    • 感谢@colde 的建议,我添加了第三个选项。
    • 预签名 URL 的想法是在他们单击“上传”时创建 URL,然后将他们尝试上传的文件发布到 URL?
    • @WilliamRoss 就是这样,是的。基本上,这样您就不必打开连接来接收它。
    • 是的,您可以这样做,但这是一个安全漏洞,因为您需要将 AWS 凭证传递给客户端,而您不想这样做。使用 boto 在您的 Python 应用程序中生成 URL 并发送到浏览器.. boto3.readthedocs.io/en/latest/reference/services/…
    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多