Sorl-thumbnail + DigitalOcean + Amazon S3 缓慢

Jam*_*Lin 0 sorl-thumbnail

由于 AWS EC2 有点贵,我尝试迁移到 DigitalOcean,但我发现从 DigitalOcean 渲染带有缩略图的页面有点慢,Amazon S3 是文件存储。(从 EC2 运行非常快,我假设 Amazon 内的流量)

症状:

  1. 由于缩略图创建,初始加载非常非常缓慢
  2. 后续加载也很慢,但不如初始加载慢

我有以下设置:

STATICFILES_STORAGE = DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

THUMBNAIL_KVSTORE = values.Value('sorl.thumbnail.kvstores.cached_db_kvstore.KVStore')
Run Code Online (Sandbox Code Playgroud)

我可以看到 sorl-thumbnail 在数据库的 KVStore 中生成缓存值。但在我看来,它仍然会在呈现缩略图之前检查 S3 上的文件是否存在。这与文档相矛盾:

值得注意的是,如果在键值存储中找到缩略图键,则 sorl-thumbnail 不会检查源或缩略图是否存在。

我在 SO 和 google 上搜索过,看到了一些相关的帖子,但他们已经 4 岁了,似乎没有确凿的答案。

Jam*_*Lin 5

经过多次调试,终于搞定了,问题深藏在django-storages里面的s3boto.py

问题:

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) 
Run Code Online (Sandbox Code Playgroud)

我没有 custom_domain 设置,因此对于每个缩略图,它都试图访问 S3 API 以构建 URL。

定义后AWS_S3_CUSTOM_DOMAINAWS_S3_URL_PROTOCOL它的工作速度很快。