【问题标题】:Getting images URL from Amazon S3 is extremely slow on Heroku在 Heroku 上从 Amazon S3 获取图像 URL 非常慢
【发布时间】:2021-04-27 12:47:01
【问题描述】:

我在 Heroku 上部署了一个 Django 应用程序,用户通过 Amazon S3 提交图像。

虽然,当在我的 Django 模板中使用 {{ image.url }} 提供图像时,服务器似乎从 S3 为每张图像请求一个签名的 URL,而这对于每张图像都需要几秒钟的时间,这使得网站非常缓慢(17秒加载 9 个小图像)。

我可以在日志中看到每个图像的请求:

Sending http request: <AWSPreparedRequest stream_output=True, method=GET, url=https://x.s3.ap-southeast-1.amazonaws.com/x.jpg, ...>

有没有办法等待来自 S3 的响应来提供图像? 如何优化?

这是我在settings.py 中的 S3 配置:

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = "x"
AWS_S3_FILE_OVERWRITE = False

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

更新

我设法公开了 S3 存储桶中的所有图像,并且没有通过将 AWS_QUERYSTRING_AUTH = False 添加到我的 settings.py 文件来对图像进行签名,但它仍在查询 S3 并需要永远加载。

【问题讨论】:

  • 您必须使用预签名的网址吗?您可以从 AWS CloudFront 提供您的图像吗?
  • 我正在尝试不使用签名 URL,因为签名过程太慢了。而且我需要使用 S3,因为这些是用户提交的图像,可能会占用大量空间。
  • 你说签名过程太慢是什么意思?签署 URL 几乎不需要任何时间。没有与 S3 服务的交互。您是否为 1000 个 S3 对象执行此操作?或者您实际上是在谈论将对象从 S3 下载到客户端所花费的时间?
  • 你是对的,这不是关于签名的。似乎它正在将对象从 S3 下载到服务器然后服务器回复客户端(每张图像大约需要 1.5 秒,并且图像以 10 x 10 的速度加载,这使得页面无法使用)。
  • 为什么将 S3 对象下载到您的服务器?如果您向客户端提供 S3 URL(预签名或未签名),似乎不需要将对象下载到您的服务器。

标签: django amazon-web-services amazon-s3 heroku


【解决方案1】:

我怀疑延迟是由为每个图像建立新连接引起的。我建议保持套接字打开以允许更快的后续下载,并且只需支付一次连接费用。 TCP_KEEPALIVE 参数应该通过保持套接字打开来提高性能,从而避免每次请求图像时都需要创建新连接:

https://docs.aws.amazon.com/credref/latest/refdocs/setting-global-tcp_keepalive.html

【讨论】:

    【解决方案2】:

    解决方案

    我为每个图像调用了image.heightimage.width,导致服务器将每个图像下载两次以获取这些值。

    【讨论】:

      猜你喜欢
      • 2015-05-30
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2016-05-28
      • 2021-10-14
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多