You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker-Compose部署Django 1.8.6站点后静态资源无法加载

解决Django 1.8.6 Docker部署后静态资源404问题

我之前也踩过类似的坑,结合你的配置来看,核心问题出在Django自带的runserver是开发服务器,当DEBUG=False时会直接拒绝静态资源请求,再加上你的部署配置里没做静态资源的专门处理环节。下面给你一步步拆解解决方案:

核心原因分析

你已经通过collectstatic把静态文件收集到了STATIC_ROOT目录,但runserver只适合开发环境用——生产模式下它不会处理任何静态资源请求,这就是日志里一堆404的根源。另外你的docker-compose.yml也没配置专门的静态资源服务(比如Nginx),也没启用能处理静态资源的WSGI中间件。

解决方案一:用Whitenoise快速处理(适合小型项目)

Whitenoise可以让Django在生产环境下直接托管静态资源,不需要额外Web服务器,而且完全兼容Django 1.8+:

  1. 在你的Dockerfile里添加依赖安装:
    RUN pip install whitenoise==3.3.1  # 选适配Django1.8的稳定版本
    RUN pip install gunicorn==19.9.0  # 替换runserver的生产级WSGI服务器
    
  2. 修改settings.py的中间件配置,把Whitenoise中间件插入到CommonMiddleware之后:
    MIDDLEWARE_CLASSES = (
        # 保留原有其他中间件
        'django.middleware.common.CommonMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware',  # 新增这一行
        # 保留原有其他中间件
    )
    
  3. 在settings.py末尾添加静态文件存储配置:
    STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
    
  4. 替换docker-compose.yml里的启动命令,用gunicorn替代runserver:
    command: gunicorn sites.production.settings:application --bind 0.0.0.0:8000
    

解决方案二:用Nginx反向代理+静态资源服务(适合正式生产环境)

如果是企业级部署,更推荐用Nginx专门处理静态资源,让Django只负责动态业务逻辑:

  1. 修改docker-compose.yml,添加Nginx服务并挂载静态文件目录:
    version: "3"
    services:
      nettle:
        image: mcvitty_img
        command: gunicorn sites.production.settings:application --bind 0.0.0.0:8000
        volumes:
          - ./static:/app/static  # 把容器内静态目录挂载到宿主机(假设项目根目录是/app)
          - postgres-data: {}
          - rabbitmq-data: {}
      nginx:
        image: nginx:alpine
        ports:
          - "80:80"
        volumes:
          - ./static:/usr/share/nginx/html/static  # 挂载静态文件到Nginx的静态目录
          - ./nginx.conf:/etc/nginx/conf.d/default.conf  # 自定义Nginx配置文件
        depends_on:
          - nettle
    volumes:
      postgres-data:
      rabbitmq-data:
    
  2. 在宿主机创建nginx.conf文件,配置静态资源路由和反向代理:
    server {
        listen 80;
        server_name localhost;
    
        # 处理静态资源请求,设置缓存过期时间
        location /static/ {
            alias /usr/share/nginx/html/static/;
            expires 30d;
        }
    
        # 把动态请求转发给Django服务
        location / {
            proxy_pass http://nettle:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    
  3. 验证静态文件是否正确生成:进入容器执行ls /app/static(对应你的STATIC_ROOT路径),确认collectstatic已经把所有静态文件同步到这里。

额外检查点

  • 生产环境务必保持settings.py里的DEBUG=False,临时调试可以打开,但绝对不能用于线上。
  • 确认STATIC_ROOT的路径配置正确,比如os.path.join(BASE_DIR, "static")在容器内对应的实际路径要和你挂载或配置的目录一致。

内容的提问来源于stack exchange,提问作者Dino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:07:41