Как сервер django media files с помощью docker и nginx?

Моя установка для докеризации и обслуживания приложения Django немного отличается от Nginx, поэтому решения, которые я нашел, не помогли.

Я докеризировал приложение django, и оно работает нормально, за исключением медиафайлов. Я использую 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 дня :)

Также я не вижу у вас никакого блока nginx в вашем файле docker-compose. Ваш

Вы должны попробовать этот способ как в разделе backend, так и в разделе reverse proxy

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

и в файл nginx добавьте следующее:

 alias /backend/static_cdn;

Примечание: Пожалуйста, обновите ваш docker-compose файл для nginx/reverse proxy подобно этому

Почему вы должны сопоставить с локальной физической машиной, а не с контейнером? Потому что вы получите ошибку отказа в разрешении, если вы не сопоставите локальную машину с контейнером

Вернуться на верх