首页 > 解决方案 > Django 使用 DEBUG = False 和 Nginx 在错误目录中查找媒体文件

问题描述

我的 2 个 Django 应用程序在mysite.commysite.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)

标签: djangonginxgunicorn

解决方案


除了@0p3r4t0r 答案之外,您还应该在您的 中进行以下更改nginx.conf

    location /app2/static/ {
        root /home/user/;
    }
    location /app2/media/ {
        root /home/user/;
    }

甚至只有当您的app2URI 前缀与您的app2文件夹名称相同时,这才有效。否则,您将需要一个alias指令:

    location /app2/static/ {
        alias /home/user/app2/static/;
    }
    location /app2/media/ {
        alias /home/user/app2/media/;
    }

但如果它们相同,则首选第一个配置。


推荐阅读