Обслуживание медиаконтента с помощью Django и Nginx
Я создаю DRF
приложение, которое размещается на удаленном сервере. У меня есть PostgreSQL
и Django Rest Framework
, работающие внутри Docker
контейнеров, и Nginx
непосредственно на хосте.
Теперь, когда я делаю запрос к https://example.com/path/to/file - я получаю изображение, обслуживаемое Nginx
правильно. Но моя проблема в том, что когда Django
возвращает мне JSON
объект с данными, поле image_url
(Django's ImageField
- путь к файлу) равно http://localhost:6500/path/to/file Этот 6500 порт и localhost генерируются Docker
. Вместо этого я предполагал, что она будет возвращать следующее: https://example.com/path/to/file.
Вот мой Nginx
файл:
server {
server_name api.example.com www.api.example.com;
access_log /var/log/nginx/api.example.com-access.log;
error_log /var/log/nginx/api.example.com-error.log;
location /media/ {
alias /opt/site_backend_docker/Site_Backend/apps/media/;
}
location / {
client_max_body_size 0;
gzip off;
## https://github.com/gitlabhq/gitlabhq/issues/694
## Some requests take more than 30 seconds.
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/api.example.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
}
server {
if ($host = api.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name api.example.com www.api.example.com;
listen 80;
return 404; # managed by Certbot
}
А мои Django
настройки для медиаконтента:
MEDIA_ROOT = str(APPS_DIR / "media")
MEDIA_URL = "/media/"
Извините, если мой вопрос глупый, это мой первый опыт в развертывании. Буду очень благодарен за любую помощь.
P.S. Я знаю, что Amazon S3
и другие решения для обслуживания медиа в продакшене несравнимо лучше, но я пока использую только правильное (сам Django).