Sorl-thumbnail + DigitalOcean + Amazon S3 缓慢

Sorl-thumbnail + DigitalOcean + Amazon S3 slowness

由于 AWS EC2 有点贵,我尝试迁移到 DigitalOcean,但我发现使用 Amazon S3 作为文件存储的 DigitalOcean 渲染带有缩略图的页面有点慢。 (运行 来自 EC2 的速度非常快,我假设是亚马逊内部的流量)

症状:

  1. 由于创建了缩略图,初始加载非常非常慢
  2. 后续加载也很慢,但没有初始加载慢

我有以下设置:

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_DOMAINAWS_S3_URL_PROTOCOL 后,它的工作速度非常快。