使用 Docker、nginx 和 gunicorn 为 Django 静态文件提供服务

Anu*_*TBE 8 django nginx docker

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

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

这是settings.py内容

STATIC_URL = '/static/'

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

STATIC_ROOT = os.path.join(BASE_DIR, 'static_cdn', 'static_root')
Run Code Online (Sandbox Code Playgroud)

在开发时,我把我的静态文件放在里面static_my_project,运行collectstatic副本到static_cdn/static_root

目录结构就像

app
 |- myapp
    |- settings.py
 |- static_my_project
 |- static_cdn
    |- static_root
 |- config
    |- nginx
       |- nginx.conf
 |- manage.py
 |- Docker
 |- docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

跑步时

docker-compose up --build
Run Code Online (Sandbox Code Playgroud)

在运行时collectstatic,它给出了静态文件将被复制的路径

koober-dev | --: 运行 collectstatic
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 | 输入“是”继续,或输入“否”取消:
myapp-dev | 0 静态文件复制到“/app/static_cdn/static_root”,210 未修改。

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

upstream web {
    ip_hash;
    server web:9010;
}

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

    location / {
        proxy_pass http://web;
    }
    listen 10080;
    server_name localhost;
}
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

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"
Run Code Online (Sandbox Code Playgroud)

文件

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/
Run Code Online (Sandbox Code Playgroud)

但它没有加载静态文件。

Pra*_*wal 15

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

docker-compose.yml

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
Run Code Online (Sandbox Code Playgroud)

现在在你的 nginx.conf 添加:

location /static/ {
    alias /static/;
}
Run Code Online (Sandbox Code Playgroud)

  • 我试过了,它对我有用。看一看。https://gitlab.com/pranavagg/django-docker-sample (2认同)