python - NGINX 在 Dockered Django 项目(Nginx、Django、Docker)中找不到媒体文件
问题描述
问题
我正在运行一个Django
由Nginx
内部提供的应用程序Docker container
,当我尝试访问在管理员中上传的一些将存储在media
文件夹中的资源时,它们给了我一个404 error
,这仅在我使用 Docker 运行应用程序时发生,因为如果我使用python manage.py runserver
媒体文件运行应用程序,则可以正常提供服务。
我有的
控制台错误
GET /media/admcali.TXT HTTP/1.1" 404 179
设置.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/"
网址.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;
}
}
码头工人-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
解决方案
问题在于 nginx.conf 和 urls.py 路径配置不一致。您在这里有两个选择:
更新 urls.py
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
更新 nginx.conf
# app media uploaded files
位置/管理员/ {
推荐阅读
- python - 如何在 Python 中添加数字?
- image - Pytorch:加载灰度图像数据集
- java - 创建名为“servletEndpointRegistrar”的 bean 时出错 Spring Boot
- php - 旧版 Symfony 项目:PHP 警告:session_start():会话 ID 太长或包含非法字符
- django - Django 上下文不在基本模板中呈现
- javascript - 视频已经播放时如何更改 HTML 视频播放速率?
- react-native - rn-fetch-blob:如何测试上传图片
- r - 你如何使用ggplot创建这个仪表图?
- java - XSL - 排除对 ACCESS_EXTERNAL_STYLESHEET 的访问
- kubernetes - 如何将普罗米修斯适配器移动到另一个命名空间?