在Elastic Beanstalk Docker环境中配置Django静态文件服务
解决Elastic Beanstalk Docker环境中Django静态文件404的问题
我来帮你搞定这个静态文件404的问题,核心思路就是让EB主机上的Nginx直接访问容器挂载出来的静态文件目录,完全避开让gunicorn处理静态请求的坑。下面是一步步的具体操作:
1. 确保Django正确收集静态文件
首先得保证你的Django项目能把所有分散的静态文件收拢到容器内的统一目录:
- 在
settings.py里确认静态文件相关配置正确:STATIC_ROOT = '/static' # 容器内的目录,专门存放收集后的静态文件 STATIC_URL = '/static/' - 在
Dockerfile中添加收集静态文件的命令(必须放在安装依赖之后,不然Django还没装没法执行):RUN pip install -r requirements.txt # 自动收集所有静态文件到STATIC_ROOT指定的目录 RUN python manage.py collectstatic --noinput
2. 配置Dockerrun.aws.json挂载静态目录到EB主机
EB的Nginx运行在主机层面,所以需要把容器内的静态文件目录挂载到主机的可访问路径。修改你的Dockerrun.aws.json,添加Volumes配置:
{ "AWSEBDockerrunVersion": "1", "Ports": [ { "ContainerPort": "8002", "HostPort": "8000" } ], "Volumes": [ { "HostDirectory": "/var/app/current/static", "ContainerDirectory": "/static" } ] }
这个配置会在容器启动时,把容器内的/static目录(也就是你收集静态文件的目录)挂载到EB主机的/var/app/current/static目录下,这样Nginx就能直接读取到这些静态文件了。
3. 配置EB的Nginx规则来提供静态文件
接下来要让Nginx知道当请求/static/路径时,去主机的挂载目录找文件。我们需要通过.ebextensions来添加自定义Nginx配置:
- 在项目根目录创建
.ebextensions文件夹 - 在里面创建
00_static_files.config文件,内容如下:
files: "/etc/nginx/conf.d/static.conf": mode: "000644" owner: root group: root content: | location /static/ { alias /var/app/current/static/; expires 30d; # 设置静态文件缓存,提升访问性能 add_header Cache-Control "public, max-age=2592000"; access_log off; # 关闭静态文件的访问日志,减少日志量 }
这个配置会在EB主机上生成一个Nginx的额外配置文件,告诉Nginx处理/static/开头的请求时,直接返回/var/app/current/static/目录下的文件,同时设置了30天的缓存策略,优化用户访问体验。
4. 重新部署并验证
把所有修改后的文件(Dockerfile、Dockerrun.aws.json、.ebextensions目录)都提交到版本控制,然后重新部署到Elastic Beanstalk。部署完成后:
- 可以通过EB控制台的实例连接功能,ssh到主机上检查
/var/app/current/static目录是否有静态文件 - 访问你的EB域名下的静态文件路径(比如
http://your-eb-domain/static/css/base.css),确认不再返回404 - 如果还是有问题,可以查看Nginx的日志(
/var/log/nginx/access.log和error.log)来排查具体原因
内容的提问来源于stack exchange,提问作者EastSw
相关产品推荐
相关产品推荐

