使用 Docker/Nginx 设置 Django 静态

Posted

技术标签:

【中文标题】使用 Docker/Nginx 设置 Django 静态【英文标题】:Setting up Django static with Docker/Nginx 【发布时间】:2022-01-24 04:15:09 【问题描述】:

我正在对我的 Django/React 应用程序进行 Dockerizing,但在将静态文件显示在产品服务器上时遇到问题。

项目目录

.
├── README.md
├── backend
│   ├── Dockerfile
│   ├── Dockerfile.prod
│   ├── backend
│   ├── entrypoint.prod.sh
│   ├── entrypoint.sh
│   ├── manage.py
│   ├── requirements.txt
│   └── static
├── docker-compose.ci.yml
├── docker-compose.prod.yml
├── docker-compose.yml
├── frontend
│   ├── Dockerfile
│   ├── Dockerfile.prod
│   ├── README.md
│   ├── build
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── public
│   ├── src
│   └── webpack.config.js
└── nginx
    ├── Dockerfile
    └── nginx.conf

nginx.conf

upstream backend 
    server backend:8000;


server 
    listen 80;

    location / 
        root "/var/www/frontend";
        

    location /api/ 
        proxy_pass http://backend;
        proxy_set_header Host $http_host;
    

    location /admin/ 
        proxy_pass http://backend;
        proxy_set_header Host $http_host;
    
    
    location /static/ 
        alias /backend/static;
    

Django 静态设置

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

docker-compose.ci.yml(构建镜像):

version: "3.8"

services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile.prod
    image: "$BACKEND_IMAGE"
    command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static_volume:/backend/static
      - media_volume:/backend/media
    expose:
      - 8000
    env_file: .env
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile.prod
    image: "$FRONTEND_IMAGE"
    volumes:
      - frontend_build:/frontend/build
  nginx:
    build:
      context: ./nginx
    image: "$NGINX_IMAGE"
    ports:
      - 80:80
    volumes:
      - static_volume:/backend/static
      - frontend_build:/var/www/frontend
    depends_on:
      - backend
      - frontend

volumes:
  frontend_build:
  static_volume:
  media_volume:

在 Chrome 开发工具的网络选项卡中,它会在尝试加载静态时显示此 URL:

请求网址:http://ipaddress/static/admin/css/nav_sidebar.cs

【问题讨论】:

STATIC_ROOT 解析为什么?应该是/backend/static/ 是的,它解析为/backend/static/ 一些健全性检查。你跑collectstatic了吗?你在nginx 容器docker-compose exec nginx ls /backend/static 中看到你的静态文件了吗? collectstatic 在构建期间运行 - 我复制文件不是问题,对吧?登录服务器时,我可以运行 docker exec -it b43 shls /backend 来查看 /static 目录。 “构建期间”是指 Dockerfile 中的 collectstatic 吗? 【参考方案1】:

在构建期间收集在backend 容器内的静态文件被static_volume 隐藏,它在您运行docker-compose 时挂载。

当您在目录顶部安装卷时,您只能看到卷的内容,而不是之前目录中的文件。

你可以解决这个问题

安装卷后运行collectstatic。 IE。服务器启动后 在构建时将 Django 生成的静态文件复制到 nginx 容器中(不再需要使用卷)

【讨论】:

以上是关于使用 Docker/Nginx 设置 Django 静态的主要内容,如果未能解决你的问题,请参考以下文章

docker、nginx、django 以及如何提供静态文件

Docker NGINX 代理不转发 Websocket

无法通过域 URL 访问 Nginx 站点

mac docker 部署nginx

Django 频道和 uWSGI

Docker&Nginx-设置SSL