Django搭配Nginx无法加载静态文件,Gunicorn运行正常求排查
Django静态文件Nginx无法加载的遗漏配置步骤
核心问题与遗漏点:
1. Nginx静态文件路径配置错误
当前Nginx的location /static使用root指令会导致路径拼接错误:
location /static { root /usr/src/app/staticfiles; }
当访问/static/css/style.css时,Nginx会尝试查找/usr/src/app/staticfiles/static/css/style.css,但collectstatic生成的文件实际存放在/usr/src/app/staticfiles/根目录下。正确应该使用alias指令:
location /static/ { alias /usr/src/app/staticfiles/; }
(注意路径末尾的斜杠,避免匹配歧义)
2. Docker容器未启动Nginx服务
当前Dockerfile的CMD仅启动了Gunicorn,Nginx并未被启动。需要同时启动两个服务:
- 方法一:使用
supervisor管理进程(推荐)
安装supervisor并配置:RUN apt-get install -y nginx supervisor COPY website/supervisord.conf /etc/supervisor/conf.d/supervisord.conf CMD ["supervisord", "-n"]supervisord.conf示例:[supervisord] nodaemon=true [program:gunicorn] command=gunicorn --bind 0.0.0.0:8000 website.wsgi:application directory=/usr/src/app user=root [program:nginx] command=nginx -g "daemon off;" - 方法二:使用shell脚本启动
创建start.sh脚本:
在Dockerfile中添加:#!/bin/bash nginx -g "daemon off;" & gunicorn --bind 0.0.0.0:8000 website.wsgi:applicationCOPY start.sh /usr/src/app/start.sh RUN chmod +x /usr/src/app/start.sh CMD ["/usr/src/app/start.sh"]
3. Docker未暴露Nginx监听的80端口
Nginx配置监听80端口,但Dockerfile仅EXPOSE 8000,需要添加:
EXPOSE 80 8000
4. 缺失Nginx配置语法检查步骤
在Dockerfile中添加Nginx配置检查,提前发现语法错误:
RUN nginx -t
额外验证点:
- 确认
collectstatic执行后,/usr/src/app/staticfiles目录下存在完整的静态文件 - 查看容器内Nginx日志(路径
/var/log/nginx/),排查具体404错误的文件路径
内容的提问来源于stack exchange,提问作者Gitau Wairimu
相关产品推荐
相关产品推荐

