【问题标题】:NGINX not finding media files in Dockered Django project (Nginx, Django, Docker)NGINX 在 Dockered Django 项目(Nginx、Django、Docker)中找不到媒体文件
【发布时间】:2021-04-17 21:56:11
【问题描述】:

问题

我正在运行一个由NginxDocker container 中提供服务的Django 应用程序,当我尝试访问管理中上传的一些资源时,这些资源将存储在media 文件夹中,他们给出我是404 error,只有当我使用 Docker 运行应用程序时才会发生这种情况,因为如果我使用 python manage.py runserver 运行应用程序,媒体文件将正常提供。

我有什么

控制台错误

GET /media/admcali.TXT HTTP/1.1" 404 179

settings.py

from pathlib import Path

ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent
APPS_DIR = ROOT_DIR / "my_app"

MEDIA_ROOT = str(APPS_DIR / "media")
MEDIA_URL = "/media/"

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

nginx.conf

upstream django {
    server backend:8000;
}

server {
    listen 80;

    location / {
            proxy_pass http://django;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;
            client_max_body_size 4G;
    }

    # app media uploaded files
    location /media/ {
            alias /app/my_app_name/media/;

            proxy_pass http://django;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;
            client_max_body_size 4G;
    }
}

docker-compose.yml

version: '3.8'

services:
  nginx:
    build:
      context: ./nginx
      dockerfile: ./Dockerfile
    ports:
      - 1300:80
    depends_on:
      - backend
    networks:
      - backend-tier
    volumes:
      # shared volume between nginx, worker, beat and backend for media
      - app-media:/app/my_app_name/media/

  backend:
    expose:
      - 8000
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        STATIC_URL: '/static/'
    restart: unless-stopped
    depends_on:
      - db
      - redis
    networks:
      - backend-tier
    volumes:
      - ./my_app_name/:/app/my_app_name:Z,cached
      - ./my_app_name/templates/:/app/my_app_name/templates:Z,cached
      # shared volume between nginx, worker, beat and backend for media
      - app-media:/app/my_app_name/media/

  db:
    image: library/postgres:11.1-alpine
    ports:
      - 5439:5432
    restart: unless-stopped
    networks:
      - backend-tier
    volumes:
      - valor-db:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword
      - POSTGRES_DB=mydb

  redis:
    image: library/redis:5.0-alpine
    ports:
      - 6379:6379
    restart: unless-stopped
    networks:
      - backend-tier
    volumes:
      - valor-redis:/data

  worker:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        STATIC_URL: '/static/'
    command: celery -A config --app=config.celery_app:app worker --loglevel=info
    restart: unless-stopped
    depends_on:
      - redis
    networks:
      - backend-tier
    volumes:
      - ./my_app_name/:/app/my_app_name:Z,cached
      - ./my_app_name/templates/:/app/my_app_name/templates:Z,cached
      # shared volume between nginx, worker, beat and backend for media
      - app-media:/app/my_app_name/media/
    env_file: common.env

  beat:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        STATIC_URL: '/static/'
    command: celery -A config --app=config.celery_app:app beat --loglevel=info
    restart: unless-stopped
    depends_on:
      - redis
    networks:
      - backend-tier
    volumes:
      - ./my_app_name/:/app/my_app_name:Z,cached
      - ./my_app_name/templates/:/app/my_app_name/templates:Z,cached
      # shared volume between nginx, worker, beat and backend for media
      - app-media:/app/my_app_name/media/
    env_file: common.env

volumes:
  app-db:
    driver: local
  app-redis:
    driver: local
  app-media:

networks:
  backend-tier:
    driver: bridge

【问题讨论】:

    标签: python docker nginx docker-compose


    【解决方案1】:

    问题在于 nginx.conf 和 urls.py 路径配置不一致。您有两种选择:

    1. 更新 urls.py

      urlpatterns += static(settings.MEDIA_URL,
                    document_root=settings.MEDIA_ROOT)
      
    2. 更新 nginx.conf

        # app media uploaded files
      

      位置/管理员/ {

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多