【发布时间】: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