Подача медиафайлов из-за пределов папки Django-project с помощью Nginx

Я пытаюсь обслуживать в продакшене (не в разработке) медиафайлы для моего Django-проекта с помощью Nginx-сервера. Медиа-файлы не находятся в папке django.

Структура папок выглядит следующим образом:

|- django_user
|     |- media
|     |- Myproject
|          |- static
|          |- myproject
|               |- settings.py

Nginx-Server:

upstream websocket{
        server 127.0.0.1:6379;
}
server {
    server_name myproject.com;

    client_max_body_size 5M;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/django_user/Myproject;
    }

    location /media/ {
        root /home/django_user/media;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/myproject.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/myproject.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location /ws {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;
        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-Host $server_name;
        proxy_set_header X-Forwarded-Proto  $scheme;
    }

}
server {
    if ($host = myproject.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name myproject.com
    return 404; # managed by Certbot


}

Вот часть моего settings.py:

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

MEDIA_ROOT = '/home/django_user/Myproject/media'

MEDIA_URL = '/media/'

Сохранение файлов в папке media работает. Я настроил поле изображения следующим образом:

myicon = models.ImageField(default="static/images/default_icon.png" , blank=True, upload_to="images/")

Я проверил это и изображения (например, test.png) правильно сохраняются в /home/django_user/media/images. Моя проблема заключается в том, что изображения в папке media не могут быть показаны на моем сайте (myproject.com/images/test.png), он всегда показывает мне:

Not Found
The requested resource was not found on this server.

Я уже сделал "manage.py collectstatic", и статические файлы загружаются правильно. Только медиа-файлы не найдены.

Я также пробовал следующие варианты моего nginx-сервера, все без успеха:

location /media/ {
     root /home/django_user;
}

location /media {
     root /home/django_user/media/;
}

location /media {
     root /home/django_user/;
}

location /media/ {
    alias /home/django_user/media/;
}

Можете ли вы помочь мне с этой проблемой? Что я упускаю или где моя ошибка?

Попробуйте alias метод:

location /media/ {
    alias /home/django_user/media/;
}

Я думаю, вы пытаетесь использовать неправильный URL.

Если вы определяете:

MEDIA_URL = '/media/ и location /media/

Тогда URL должен быть myproject.com/media/images/test.png вместо myproject.com/images/test.png в обоих сценариях (разработка и производство)

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