【问题标题】:How to server django media files with docker and nginx?如何使用 docker 和 nginx 服务 django 媒体文件?
【发布时间】:2021-10-20 14:50:11
【问题描述】:

当涉及到 Nginx 时,我的 Django 应用程序的 dockerizing 和服务设置有点不同,所以我找到的解决方案没有帮助。

我已经对 django 应用程序进行了 docker 化,除了媒体文件外,它的工作正常。我没有在容器内使用 nginx,而是在实际服务器上使用。除媒体文件外,所有请求甚至静态文件都得到完美服务。 这是静态和媒体的设置:

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

MEDIA_ROOT = os.path.join(BASE_DIR, 'media_cdn')
MEDIA_URL = '/media/'


STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

这是我的 docker-compose 文件:

version: "3"
services:
  backend:
    image: gitrepo:latest
    #image: 731d5d7e9296
    ports:
      - 8400:8000
    links:
      - database
    command: bash -c "python manage.py migrate
      && python manage.py collectstatic --noinput
      && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - media-cdn-data:/app/media_cdn
    deploy:
      restart_policy:
        condition: on-failure

    tty: true

  database:
    image: "postgres:12" # use latest official postgres version
    env_file:
      - database.env # configure postgres
    volumes:
      - database-data:/var/lib/postgresql/data/ # persist data even if container shuts down
volumes:
  database-data: # named volumes can be managed easier using docker-compose
  media-cdn-data:

这是我的 nginx 文件:

server {
       server_name app.platformname.com;
             location /media/ {
                 proxy_pass http://127.0.0.1:8400/;
                 alias /app/media_cdn/;
             }
       location / {
            proxy_pass http://127.0.0.1:8400/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_read_timeout 3600;
            proxy_set_header Connection '';
            # these two lines here
            proxy_http_version 1.1;
        }
}

感谢任何帮助,过去 4 天我一直在努力解决这个问题 :)

【问题讨论】:

  • 有什么原因你也没有通过 docker-compose 运行 nginx 吗?通过 nginx 直接从文件系统提供静态和媒体文件是标准方式,您需要在主机上挂载一个目录作为媒体卷,然后 nginx 可以从该目录提供媒体文件
  • 嘿伊恩谢谢你的回复。我还添加了 settings.py 以防万一:)

标签: django docker nginx django-media


【解决方案1】:

我也没有看到你的 docker-compose 文件中有任何 nginx 块。你的

您在后端部分和反向代理部分都尝试过这种方式

 - "./dist/static_cdn:/backend/static_cdn" # map physical machine

并在 nginx 文件中添加:

 alias /backend/static_cdn;

注意:请更新您的docker-compose 文件以使用类似于此的 nginx/反向代理

为什么要映射到本地物理机而不是容器?因为,如果您不将本地机器映射到容器,您将收到权限被拒绝错误

【讨论】:

  • 嘿 @anamul 我更新了我的 settings.py。
  • @sh_07 我已经更新了答案,但你必须确保你的 nginx 在 docker-compopse 中,并在 docker-compose 上使用 nginx 块和后端块以相同的方式映射 memida 根
  • 好吧,我试试看,但你知道为什么静态文件可以使用这个配置而不是媒体文件吗?
  • 我怀疑你的静态文件可以工作,因为你的 setitngs.py 文件 DEBUG=True,如果你的 debug=False,那么你必须修复 docker 和 nginx 的问题,否则,它将无法工作
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 2018-02-20
  • 2021-11-29
  • 2019-07-21
  • 2019-12-01
  • 1970-01-01
  • 2017-09-17
  • 2021-04-17
相关资源
最近更新 更多