Nginx+Django部署后静态资源无法加载问题求助
Django Admin静态资源加载失败问题排查与解决
问题场景
环境为Django + uWSGI + Nginx + PostgreSQL,已执行python manage.py collectstatic将静态文件收集至movies_admin/static目录,但通过Nginx访问127.0.0.1/admin时,页面仅加载文本、表单字段,图片、CSS等静态资源完全无法显示。
现有配置文件
docker-compose.yml
version: '3' services: django: restart: always build: movies_admin/. env_file: - .env ports: - "8000:8000" container_name: work_django depends_on: - postgres postgres: restart: always env_file: - .env image: 'postgres:${PG_VER}' environment: - POSTGRES_DB=${DB_NAME} - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASSWORD} container_name: work_database ports: - "5432:5432" volumes: - ${DB_VOLUME_CATALOG_PATH}:/var/lib/postgresql/data/ nginx: image: 'nginx:${NGINX_VER}' volumes: - ${NGINX_CONF_FILE}:/etc/nginx/nginx.conf:ro - ${NGINX_CONFD_CATALOG}:/etc/nginx/conf.d:ro - ${STATIC_PATH}:/var/www/static/:ro container_name: work_nginx depends_on: - django ports: - "80:80"
Nginx site.conf
server { listen 80 default_server; listen [::]:80 default_server; server_name _; location /static/ { alias /var/www/static/; } location @backend { proxy_pass http://django:8000; } location ~* \.(?:jpg|jpeg|gif|png|ico|css|js)$ { log_not_found off; expires 90d; } location / { try_files $uri @backend; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
Django settings.py 相关配置
STATIC_ROOT = '/var/www/static' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static/'), '/opt/app/static/', ] STATIC_URL = '/static/'
排查修复步骤
1. 确认静态文件挂载与存在性
- 检查
.env里的STATIC_PATH是否指向本地的movies_admin/static目录,确保挂载路径正确。 - 进入Nginx容器执行
ls /var/www/static/,确认admin/css/、admin/img/这类Django admin的静态文件是否存在。
2. 调整Nginx规则优先级
当前配置中,后缀匹配的location ~* \.(jpg|jpeg|...)优先级高于/static/路径匹配,导致静态资源请求被错误转发到后端。修改配置如下:
server { listen 80 default_server; listen [::]:80 default_server; server_name _; # 优先处理静态资源请求 location /static/ { alias /var/www/static/; expires 90d; log_not_found off; } location @backend { proxy_pass http://django:8000; # 补充代理头,避免Django识别异常 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { try_files $uri @backend; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
- 移除单独的后缀匹配规则,把缓存控制直接整合到
/static/的location中。
3. 验证Django静态文件收集路径
- 进入Django容器执行
python manage.py collectstatic --noinput,确认输出是否将文件收集到/var/www/static(对应settings里的STATIC_ROOT)。 - 如果容器内不存在
/var/www/static目录,需要在Dockerfile中添加RUN mkdir -p /var/www/static,或者修改STATIC_ROOT为容器内的movies_admin/static,再通过docker-compose挂载到Nginx。
4. 检查浏览器请求状态
- 打开浏览器开发者工具(F12),查看Network面板:
- 若静态资源返回404:确认Nginx容器内对应路径下是否存在该文件。
- 若返回502:检查Nginx容器能否ping通django容器(执行
docker exec work_nginx ping django)。
内容的提问来源于stack exchange,提问作者Darron
相关产品推荐
相关产品推荐

