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

Posted

技术标签:

【中文标题】使用 Docker、nginx 和 gunicorn 提供 Django 静态文件【英文标题】:serving Django static files with Docker, nginx and gunicorn 【发布时间】:2018-11-14 02:17:40 【问题描述】:

我正在为我们设置一个带有DockernginxgunicornDjango 2.0 应用程序。

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

这是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')

在开发过程中,我将静态文件放在 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

正在运行

docker-compose up --build

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

koober-dev | --: 运行 collectstatic 库伯开发 | 库伯开发 |您已请求在目的地收集静态文件 我的应用开发 |设置中指定的位置: 我的应用开发 | 我的应用开发 | /app/static_cdn/static_root 我的应用开发 | 我的应用开发 |这将覆盖现有文件! 我的应用开发 |您确定要这样做吗? 我的应用开发 | 我的应用开发 |输入“yes”继续,或输入“no”取消: 我的应用开发 | 0 个静态文件复制到“/app/static_cdn/static_root”,210 个未修改。

config/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;

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"

Dockerfile

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/

但它没有加载静态文件。

【问题讨论】:

我认为你颠倒了你的 nginx 配置中的东西。该位置应该是浏览器期望找到的地方,而别名应该是实际的文件系统位置。 即使在反转它时也不起作用 你试过了吗:location /app/static_cdn/static_root autoindex on; alias /app/static_cdn/static_root; 也试过了。顺便说一句,它在控制台myapp-dev | Not Found: /static/theme/css/custom.css 你能澄清一下这句话是什么意思吗? “在开发过程中,我将静态文件放在 static_my_project 中,它在运行 collectstatic 时将副本复制到 static_cdn/static_root” 【参考方案1】:

您需要有一个到STATIC_ROOT 目录的共享卷,以便您的nginxcontainer 可以反向代理到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

现在在你的 nginx.conf 添加:

location /static/ 
    alias /static/;

【讨论】:

docker-compose.yml 更新的问题没有给出错误Mounts denied: The path /static is not shared from OS X and is not known to Docker 您尚未添加 docker 可访问的 /static 路径。你可以用 [***.com/questions/45122459/….此外,您不应将完整的源代码挂载到两个容器。只需挂载需要在容器之间共享的部分。在您的示例中,只有 STATIC_ROOT 需要在 nginx 和 Web 容器之间共享。在答案中编辑了安装路径。 static_cdn 目录位于application 目录中,该目录位于user 目录中,user 已存在于Docker 可共享路径中。我尝试了您的更改,但仍然没有成功。这次它没有给Mount denied,但是在访问该网站时,它给出了文件未找到并且只显示文本 您是否在启动容器后运行python manage.py collectstatic --noinput?您的安装路径,即 app/static_cdn/static_root 应该包含您尝试使用 nginx 提供的静态文件 我试过了,它对我有用。看一看。 gitlab.com/pranavagg/django-docker-sample

以上是关于使用 Docker、nginx 和 gunicorn 提供 Django 静态文件的主要内容,如果未能解决你的问题,请参考以下文章

使用docker容器安装nginx的使用

使用 nginx 和 docker 测试本地子域

使用 Nginx 和 Docker 部署 React 和 Django

AWS ECS 使用 docker 和 nginx,如何将我的 nginx 配置放入容器中?

Docker 安装 Nginx

nginx docker怎么配置