django - Django 使用 DEBUG = False 和 Nginx 在错误目录中查找媒体文件
问题描述
我的 2 个 Django 应用程序在mysite.com和mysite.com/app2上使用 Nginx 和 Gunicorn 运行。
App1的媒体文件运行良好。对于DEBUG=False的app2,我在尝试下载媒体文件时得到 404,尽管它为文件生成的 url 是正确的(它与服务器上的目录匹配)。
从nginx错误日志中我发现它可能正在app1的媒体目录中寻找它。
如何让app2在正确的目录中查找媒体?
Nginx 日志错误:
*2020/06/09 13:24:51 [错误] 9378#9378: 1 open() "/home/user/app1/media/attach_1/attach.pdf" 失败(2:没有这样的文件或目录),客户端:134.94.7.210,服务器:mysite.com,请求:“GET /media/attach_1/attach.pdf HTTP/1.1”,主机:“mysite.com”,引用者:“mysite.com/app2/”
Nginx 配置:
server {
listen 80;
server_name server_domain;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/user/app1;
}
location /app2/static/ {
root /home/user;
}
location /media/ {
root /home/user/app1;
}
location /app2/media/ {
root /home/user;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/app1.sock;
}
location /secondapp/ {
include proxy_params;
proxy_pass http://unix:/run/app2.sock:/;
}
}
app2.settings:
STATIC_URL = '/static/'
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = 'media/'
我也有urlpatterns = [...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
解决方案
除了@0p3r4t0r 答案之外,您还应该在您的 中进行以下更改nginx.conf
:
location /app2/static/ {
root /home/user/;
}
location /app2/media/ {
root /home/user/;
}
甚至只有当您的app2
URI 前缀与您的app2
文件夹名称相同时,这才有效。否则,您将需要一个alias
指令:
location /app2/static/ {
alias /home/user/app2/static/;
}
location /app2/media/ {
alias /home/user/app2/media/;
}
但如果它们相同,则首选第一个配置。
推荐阅读
- javascript - JavaScript 原型函数覆盖
- odoo - Odoo - 从其他模块更改字段
- javascript - 事件监听器似乎不认识我的班级?
- node.js - 如何在 Node.js 中将环境变量设置为未定义?
- ubuntu - 尝试获取时没有可构建的 Go 源文件
- sql - 存储用户帐户权限的最佳方式?
- swift - 如何使用应用程序委托以编程方式控制启动图像?
- java - 如何在 Java 的 LocalDateTime 和 LocalDate 上配置 Jackson 序列化?
- java - 为什么 Jenkins 没有运行我所有的 TestNG 测试?
- python - Pandas 基于密码重命名列