如何在AWS Elastic Beanstalk(Python3.6+Amazon Linux2.7.7)中部署静态文件?
解决AWS Elastic Beanstalk上Django静态文件无法加载的问题
针对你的环境(Python 3.6,64位Amazon Linux/2.7.7的Elastic Beanstalk)和项目结构,我来一步步帮你修复静态文件的配置问题:
1. 修正settings.py中的静态文件配置
你的STATIC_ROOT和STATICFILES_DIRS配置搞反了,这是核心问题:
STATIC_ROOT是collectstatic命令收集所有静态文件的目标目录,绝对不能指向你项目里的静态源目录(ecs_site/static),得用一个专门存放收集后文件的独立目录,比如项目根目录下的staticfiles。STATICFILES_DIRS是告诉Django去哪里找自定义的静态文件目录,这里应该指向你ecs_site app下的static文件夹。
修改后的settings.py相关配置如下:
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 正确的STATIC_ROOT:collectstatic会把所有静态文件归集到这里 STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 正确的STATICFILES_DIRS:指定app内的静态文件源目录 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'ecs_site/static'), ] STATIC_URL = '/static/'
2. 让Elastic Beanstalk自动运行collectstatic
EB默认会在部署时自动执行collectstatic,但为了保险起见,你可以在项目根目录创建.ebextensions文件夹,添加01_django.config配置文件,强制确保这个步骤执行:
container_commands: 01_collectstatic: command: "python manage.py collectstatic --noinput" option_settings: aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: ecs_site.settings aws:elasticbeanstalk:container:python: WSGIPath: ecs_site/wsgi.py
3. 配置Web服务器访问静态文件
你的EB环境用Nginx做反向代理,需要配置Nginx把/static/开头的请求转发到收集后的静态文件目录。在.ebextensions里再创建02_nginx.config文件:
files: "/etc/nginx/conf.d/elasticbeanstalk/django.conf": mode: "000644" owner: root group: root content: | location /static/ { alias /var/app/current/staticfiles/; }
这个配置会告诉Nginx,当收到/static/请求时,去EB部署后的项目根目录(/var/app/current)下的staticfiles文件夹找对应文件。
4. 重新部署验证
- 先在本地运行
python manage.py collectstatic测试,确保没有报错,能正常生成staticfiles目录 - 把修改后的settings.py、
.ebextensions文件夹一起打包,重新部署到Elastic Beanstalk
如果还是有问题,可以去EB控制台的Logs选项下载完整日志,检查collectstatic是否运行成功,或者Nginx的配置是否生效。
内容的提问来源于stack exchange,提问作者SonOfSeuss
相关产品推荐
相关产品推荐

