Docker部署Django应用时Nginx无法找到静态文件的问题求助
解决Docker部署Django时Nginx无法找到静态文件的问题
问题根源梳理
- Django静态/媒体文件配置错误,使用了非官方配置项且路径不规范
- Docker卷映射不匹配,导致Nginx无法访问Django收集的静态文件
- Nginx静态文件路径配置错误
- 未执行
collectstatic将静态文件同步到指定目录
分步修正方案
1. 修正Django settings.py配置
替换错误的静态/媒体文件配置,使用绝对路径避免Docker环境下的相对路径问题:
STATIC_URL = '/static/' MEDIA_URL = '/qr_codes/' # 改为独立路径,避免与STATIC_URL路径叠加 # 使用绝对路径,确保Docker容器内路径准确 STATIC_ROOT = '/app/vol/web/static' MEDIA_ROOT = '/app/vol/web/qr_codes' # 替换错误的STATIC_MEDIA配置项
2. 调整docker-compose卷映射
让Django容器与Nginx容器共享静态文件卷,修正路径匹配问题:
services: app: build: context: . volumes: - static:/vol/web/static # 用共享卷替换本地目录挂载,确保静态文件能被Nginx访问 - ./qr_codes:/vol/web/qr_codes proxy: build: context: ./nginx volumes: - static:/vol/static # 挂载共享卷到Nginx容器的指定目录 - ./qr_codes:/vol/qr_codes # 挂载媒体文件目录(可选,若需Nginx直接处理媒体文件) ports: - "8080:8080" depends_on: - app
3. 修正Nginx default.conf配置
调整静态文件的路径指向,匹配Nginx容器内的挂载目录:
server{ listen 8080; location /static/ { # 末尾加/,避免路径拼接错误 alias /vol/static/; # 指向Nginx容器内的静态文件目录 expires 30d; # 可选,添加静态文件缓存优化 } # 若保留媒体文件原访问路径,可添加此配置 # location /static/qr_codes/ { # alias /vol/qr_codes/; # } # 若使用独立的媒体文件路径,添加此配置 location /qr_codes/ { alias /vol/qr_codes/; } location /{ uwsgi_pass app:8000; include /etc/nginx/uwsgi_params; } }
4. 确保启动时执行collectstatic
在Django的entrypoint.sh中添加静态文件收集命令,确保容器启动时将静态文件同步到STATIC_ROOT:
#!/bin/sh # 收集静态文件到指定目录,--noinput避免交互确认 python manage.py collectstatic --noinput # 启动uWSGI服务(根据你的实际启动命令调整) uwsgi --socket :8000 --master --enable-threads --module inventory.wsgi
5. 重启服务验证
# 停止现有容器 docker-compose -f docker-compose-deploy.yaml down # 重新构建并启动服务 docker-compose -f docker-compose-deploy.yaml up --build
查看app容器日志确认collectstatic执行成功,再访问页面验证静态文件是否正常加载。
内容的提问来源于stack exchange,提问作者Jacob Mutale
相关产品推荐
相关产品推荐

