首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Docker、nginx和gunicorn服务Django静态文件

问使用Docker、nginx和gunicorn服务Django静态文件
EN

Stack Overflow用户
提问于 2018-06-05 01:24:01
回答 2查看 13K关注 0票数 8

我正在设置一个带有Docker、nginx和gunicorn的Django 2.0应用程序。

它正在运行服务器,但静态文件不工作。

下面是settings.py内容

代码语言:javascript
复制
STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static_my_project')
]

STATIC_ROOT = os.path.join(BASE_DIR, 'static_cdn', 'static_root')

在开发过程中,我将静态文件放在static_my_project中,在运行collectstatic时将其复制到static_cdn/static_root中

目录结构类似于

代码语言:javascript
复制
app
 |- myapp
    |- settings.py
 |- static_my_project
 |- static_cdn
    |- static_root
 |- config
    |- nginx
       |- nginx.conf
 |- manage.py
 |- Docker
 |- docker-compose.yml

关于跑步

代码语言:javascript
复制
docker-compose up --build

在运行collectstatic时,它提供了静态文件将被复制到的路径

koober-dev | --:运行集合静态

koober-dev |

koober-dev |您已请求在目标位置收集静态文件

myapp-dev |设置中指定的位置:

myapp-dev |

myapp-dev | /app/static_cdn/static_root

myapp-dev |

myapp-dev |这将覆盖现有文件!

myapp-dev |确定要执行此操作吗?

myapp-dev |

myapp-dev |键入“yes”继续,或键入“no”取消:

myapp-dev |0静态文件已复制到'/app/ static _cdn/static_root',210个未修改。

config/nginx/nginx.conf文件包含以下设置

代码语言:javascript
复制
upstream web {
    ip_hash;
    server web:9010;
}

server {
    location /static {
        autoindex on;
        alias /static/;
    }

    location / {
        proxy_pass http://web;
    }
    listen 10080;
    server_name localhost;
}

docker-compose.yml

代码语言:javascript
复制
version: '3'

services:
  nginx:
    image: nginx:latest
    container_name: "koober-nginx"
    ports:
      - "10080:80"
      - "10443:43"
    volumes:
      - .:/app
      - ./config/nginx:/etc/nginx/conf.d
      - ./static_cdn/static_root/:/static
    depends_on:
      - web
  web:
    build: .
    container_name: "koober-dev"
    command: ./start.sh
    volumes:
      - .:/app
      - ./static_cdn/static_root/:/app/static_cdn/static_root
    ports:
      - "9010:9010"
    depends_on:
      - db
  db:
    image: postgres
    container_name: "koober-postgres-db"

文档文件

代码语言:javascript
复制
FROM ubuntu:18.04

# -- Install Pipenv:
FROM python:3
ENV PYTHONUNBUFFERED 1

ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8

# -- Install Application into container:
RUN set -ex && mkdir /app

WORKDIR /app
ADD requirements.txt /app/

RUN pip install -r requirements.txt

# -- Adding dependencies:
ADD . /app/

,但它不加载静态文件。

EN

回答 2

Stack Overflow用户

发布于 2018-06-05 03:19:16

您需要拥有STATIC_ROOT目录的共享卷,以便您的nginx容器可以反向代理web服务器和web服务器生成的静态文件。

在docker-compose.yml中

代码语言:javascript
复制
services:
  nginx:
    image: nginx:alpine
    volumes:
      - ./static_cdn/static_root/:/static
    ports:
      - 80:80
  web:
    build: .
    volumes:
      - ./static_cdn/static_root/:/app/static_cdn/static_root

现在,在您的nginx.conf中添加:

代码语言:javascript
复制
location /static/ {
    alias /static/;
}
票数 15
EN

Stack Overflow用户

发布于 2022-02-10 16:47:15

Nginx Dockerfile:

代码语言:javascript
复制
FROM nginx:stable-alpine

COPY default.conf /etc/nginx
COPY default.conf /etc/nginx/conf.d

EXPOSE 80

以上Dockerfile文件中引用的default.conf:

代码语言:javascript
复制
server {

    listen 80 default_server;
    server_name _;

    location / {
        proxy_pass http://web:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /app/static/;
    }

    location /media/ {
        alias /app/static/;
    }

}

注意:上面提到的default.conf和docker文件在同一个文件夹下,构建该镜像,并在下面的docker-compose文件中使用它作为Nginx镜像。

docker-compose文件将如下所示:

代码语言:javascript
复制
version: '3.8'

services:
  web:
    image: <django-image-name>
    command: gunicorn --bind 0.0.0.0:8000 licensing_platform.wsgi --workers=4
    volumes:
      - static_volume:/app/static
      - media_volume:/app/media
    expose:
      - "8000"
    networks:
      - django-network

  nginx:
    image: <nginx-image-name>
    restart: always
    volumes:
      - static_volume:/app/static
      - media_volume:/app/media
    ports:
      - "80:80"
    depends_on:
      - web
    networks:
      - django-network

networks:
  django-network:
    name: django-network

volumes:
  media_volume:
  static_volume:

引用的app/路径取决于工作目录: django应用程序Dockerfile文件的开头为:

代码语言:javascript
复制
FROM ubuntu:20.04
ADD . /app
WORKDIR /app
EXPOSE 8000

代码参考:https://github.com/addu390/licensing-as-a-platform

上面提到的代码参考是我正在开发的一个开源项目,没有商业利益。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50685775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档