部署在AWS Elastic Beanstalk的Django项目DEBUG=False时博客图片不显示
问题核心
当DEBUG=False时,Django不会自动处理静态文件请求——你在urls.py里用的static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)仅在DEBUG=True时生效,关闭DEBUG后,media文件的访问路由直接失效,所以博客图片加载失败。
解决办法
办法1:让Elastic Beanstalk的Nginx直接处理media请求
- 在项目根目录新建
.ebextensions文件夹,创建配置文件01_nginx_media.conf - 往文件里写以下内容,让Nginx拦截
/media/开头的请求,直接指向项目的media目录:
files: "/etc/nginx/conf.d/media.conf": mode: "000644" owner: root group: root content: | location /media/ { alias /var/app/current/media/; expires 30d; }
- 若部署后media目录权限有问题,可在同文件夹下加个权限配置文件
02_media_permissions.conf:
container_commands: 01_create_media_dir: command: "mkdir -p /var/app/current/media/" 02_set_permissions: command: "chmod -R 755 /var/app/current/media/"
- 重新部署应用到Elastic Beanstalk即可。
办法2:把media文件存到AWS S3(更适合生产环境)
如果图片较多或想优化访问速度,建议用S3托管media文件:
- 安装依赖包:
pip install django-storages boto3
- 在settings.py里添加配置(替换成你的AWS信息):
INSTALLED_APPS += ['storages'] AWS_ACCESS_KEY_ID = '你的AWS访问密钥ID' AWS_SECRET_ACCESS_KEY = '你的AWS秘密访问密钥' AWS_STORAGE_BUCKET_NAME = '你的S3存储桶名称' AWS_S3_REGION_NAME = '存储桶所在区域,比如us-east-1' AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com' # 配置media文件存储到S3 DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
- 把已有的media文件手动上传到S3存储桶的
media目录,之后用户上传的图片会自动存到S3,访问不受DEBUG模式影响。
内容的提问来源于stack exchange,提问作者user2333527
相关产品推荐
相关产品推荐

