Sorl-thumbnail + DigitalOcean + Amazon S3 缓慢
Sorl-thumbnail + DigitalOcean + Amazon S3 slowness
由于 AWS EC2 有点贵,我尝试迁移到 DigitalOcean,但我发现使用 Amazon S3 作为文件存储的 DigitalOcean 渲染带有缩略图的页面有点慢。 (运行 来自 EC2 的速度非常快,我假设是亚马逊内部的流量)
症状:
- 由于创建了缩略图,初始加载非常非常慢
- 后续加载也很慢,但没有初始加载慢
我有以下设置:
STATICFILES_STORAGE = DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
THUMBNAIL_KVSTORE = values.Value('sorl.thumbnail.kvstores.cached_db_kvstore.KVStore')
我可以看到 sorl-thumbnail 在数据库的 KVStore 中生成缓存值。但在我看来,它仍然在渲染缩略图之前检查 S3 上的文件是否存在。这与 documentation:
矛盾
It is worth noting that sorl-thumbnail does not check if source or thumbnail exists if the thumbnail key is found in the Key Value Store.
我在 SO 和 google 上搜索过,也看到了一些相关的帖子,但他们已经 4 年了,似乎没有定论。
经过多次调试,我终于搞定了,问题深埋在s3boto.py inside django-storages
问题:
def url(self, name):
name = self._normalize_name(self._clean_name(name))
if self.custom_domain:
return "%s//%s/%s" % (self.url_protocol,
self.custom_domain, name)
return self.connection.generate_url(self.querystring_expire,
method='GET', bucket=self.bucket.name, key=self._encode_name(name),
query_auth=self.querystring_auth, force_http=not self.secure_urls)
我没有 custom_domain 设置,所以对于每个缩略图,它都试图访问 S3 API 来构建 URL。
定义 AWS_S3_CUSTOM_DOMAIN
和 AWS_S3_URL_PROTOCOL
后,它的工作速度非常快。
由于 AWS EC2 有点贵,我尝试迁移到 DigitalOcean,但我发现使用 Amazon S3 作为文件存储的 DigitalOcean 渲染带有缩略图的页面有点慢。 (运行 来自 EC2 的速度非常快,我假设是亚马逊内部的流量)
症状:
- 由于创建了缩略图,初始加载非常非常慢
- 后续加载也很慢,但没有初始加载慢
我有以下设置:
STATICFILES_STORAGE = DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
THUMBNAIL_KVSTORE = values.Value('sorl.thumbnail.kvstores.cached_db_kvstore.KVStore')
我可以看到 sorl-thumbnail 在数据库的 KVStore 中生成缓存值。但在我看来,它仍然在渲染缩略图之前检查 S3 上的文件是否存在。这与 documentation:
矛盾It is worth noting that sorl-thumbnail does not check if source or thumbnail exists if the thumbnail key is found in the Key Value Store.
我在 SO 和 google 上搜索过,也看到了一些相关的帖子,但他们已经 4 年了,似乎没有定论。
经过多次调试,我终于搞定了,问题深埋在s3boto.py inside django-storages
问题:
def url(self, name):
name = self._normalize_name(self._clean_name(name))
if self.custom_domain:
return "%s//%s/%s" % (self.url_protocol,
self.custom_domain, name)
return self.connection.generate_url(self.querystring_expire,
method='GET', bucket=self.bucket.name, key=self._encode_name(name),
query_auth=self.querystring_auth, force_http=not self.secure_urls)
我没有 custom_domain 设置,所以对于每个缩略图,它都试图访问 S3 API 来构建 URL。
定义 AWS_S3_CUSTOM_DOMAIN
和 AWS_S3_URL_PROTOCOL
后,它的工作速度非常快。