在Django中为AWS S3静态和媒体文件创建自定义域CNAME

在Django中为AWS S3静态和媒体文件创建自定义域CNAME,django,amazon-s3,cdn,cname,django-staticfiles,Django,Amazon S3,Cdn,Cname,Django Staticfiles,首先我想说我不想使用Cloudfront 假设站点是example.com Bucket Name S3:示例 静态/媒体文件的URL:example.s3.amazonaws.com 通过CNAME服务器静态和媒体文件需要执行哪些步骤,如下所示: media.example.com 此外,在域名的DNS中,CNAME媒体应该精确指向什么 现在图像的服务方式如下:https://example.s3.amazonaws.com/static/image.jpg 希望它是这样的:https://m

首先我想说我不想使用Cloudfront

假设站点是
example.com

Bucket Name S3:
示例

静态/媒体文件的URL:
example.s3.amazonaws.com

通过CNAME服务器静态和媒体文件需要执行哪些步骤,如下所示:
media.example.com

此外,在域名的DNS中,CNAME
媒体
应该精确指向什么

现在图像的服务方式如下:
https://example.s3.amazonaws.com/static/image.jpg

希望它是这样的:
https://media.example.com/static/image.jpg

还有一个原因是我可以在网站管理员工具中验证CNAME

production.py

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
# STATIC FILE CONFIGURATION
# ------------------------------------------------------------------------------
# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root
STATIC_ROOT = str(ROOT_DIR('staticfiles'))

# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url
STATIC_URL = '/static/'

# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
STATICFILES_DIRS = (
    str(APPS_DIR.path('static')),
)

# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
)

# MEDIA CONFIGURATION
# ------------------------------------------------------------------------------
# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root
MEDIA_ROOT = str(APPS_DIR('media'))

# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url
MEDIA_URL = '/media/'

# DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
DEFAULT_FILE_STORAGE = 'config.custom_storages.MediaStorage'
THUMBNAIL_DEFAULT_STORAGE = 'config.custom_storages.MediaStorage'


AWS_ACCESS_KEY_ID = env('DJANGO_AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = env('DJANGO_AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = env('DJANGO_AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = env('REGION_NAME')  # e.g. us-east-2
AWS_S3_CUSTOM_DOMAIN = '{}.s3.amazonaws.com'.format(AWS_STORAGE_BUCKET_NAME)
AWS_AUTO_CREATE_BUCKET = True
AWS_QUERYSTRING_AUTH = False
AWS_S3_CALLING_FORMAT = OrdinaryCallingFormat()
AWS_DEFAULT_ACL = "public-read"

# AWS cache settings, don't change unless you know what you're doing:
AWS_EXPIRY = 60 * 60 * 24 * 7

# TODO See: https://github.com/jschneier/django-storages/issues/47
# Revert the following and use str after the above-mentioned bug is fixed in
# either django-storage-redux or boto
AWS_HEADERS = {
    'Cache-Control': six.b('max-age=%d, s-maxage=%d, must-revalidate' % (
        AWS_EXPIRY, AWS_EXPIRY))
}

# URL that handles the media served from MEDIA_ROOT, used for managing
# stored files.
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)


# Static Assests
# ------------------------
STATICFILES_STORAGE = 'config.custom_storages.CachedS3BotoStaticStorage'
COMPRESS_STORAGE = 'config.custom_storages.CachedS3BotoStaticStorage'

AWS_S3_SECURE_URLS = True

STATICFILES_LOCATION = 'static'
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)

如果它对某人有帮助——起初我不打算使用Cloudfront——但因为使用HTTPS,我不得不这么做。2个很棒的帮助文档介绍了如何使用@Michael sqlbot和@hephalump help进行设置


  • S3不提供自定义域和HTTPS,CloudFront是标准的解决方案。你为什么不想用它?嗯,这很奇怪,我有几个CNAME指向几个bucket,有一些静态站点,它们像assets.example.com一样工作并加载这些站点-但在这种情况下,我确实想将其用作django的静态/媒体存储-所以它应该可以工作-你是说canonical在S3上不工作?S3不支持HTTPS和自定义域。您可以使用HTTPS(带有amazonaws.com URL),也可以使用自定义域(仅限HTTP),但不能同时使用两者。但我认为,如果您认为S3本身比S3+CloudFront便宜得多,那么您也可能误解了定价方案。对于通过CDN缓存的内容,无论有多少边缘位置,S3都不收取带宽费用,CloudFront也不收取存储费用,CloudFront在许多领域的带宽费用也比S3稍便宜(例如,美国的带宽费用为0.085美元/GB CF,而美国东部的带宽费用为0.090美元/GB S3)。基本上,S3上的自定义域不能使用SSL,因为S3不是服务器,它是对象存储,要创建安全连接,您的域证书需要安装在服务器上,而S3本身不支持,相反,Amazon提供CloudFront作为解决方案。如果您不想利用CloudFront的缓存功能,只需将max TTL设置为0;对象将不会被缓存。首先,它解释了如何使用CloudFront为S3 bucket设置自定义域+HTTPS,如果遇到任何问题,请告诉我们。