【发布时间】:2019-12-26 20:59:00
【问题描述】:
[已解决] 这是重复的。答案在this question
(端口未包含在 django 在生产设置中生成的资源 url 中,nginx .conf 中的更改修复了它。我在特定端口上本地测试生产设置。显然,如果默认端口这不会有问题用于生产。)
我正在(本地)为我的 Django 项目创建一个(Dockerized)生产设置。我将 Django 与 Gunicorn 和 NGINX 一起使用。 NGINX 处理静态和媒体文件,(工作正常,因为我可以通过手动输入正确的 URL 来访问它们)。虽然 Django 确实正确链接到静态文件,但媒体文件的 URL 是错误的。
对于媒体文件,它会跳过 URL 中的端口,而对于静态文件则不会。我试图删除尾随/ 并设置MEDIA_URL = 'localhost:1337/media/'。我不明白为什么静态 URL 正确而媒体 URL 不正确,因为我以完全相同的方式设置它们:
settings.py:
DEBUG = False
STATIC_URL = '/static/'
STATIC_ROOT = 'path/to/static'
MEDIA_URL = '/media/'
MEDIA_ROOT = 'path/to/media'
- (正确)Django 链接到静态文件的示例:
http://localhost:1337/static/path/to/file。 - 上传媒体文件的 Django 链接示例:
http://localhost/media/path/to/file。 - 媒体文件的实际位置:
http://localhost:1337/media/path/to/file。
根据要求,nginx.conf:
upstream django_app {
server web:8000;
}
server {
listen 80;
location / {
proxy_pass http://django_app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /path/to/static/;
}
location /media/ {
alias /path/to/media/;
}
}
【问题讨论】:
-
有点困惑。您是说希望端口 1337 在 URL 中吗?看起来您已将 nginx 配置为直接提供静态文件,所以我假设您需要端口 80。
-
抱歉不清楚。 Nginx 在 docker 容器中运行。容器端口 80 映射到端口 1337。因此 localhost:1337 是您到达该站点的位置。问题是 django 跳过了指向媒体的 url 链接中的 1337,而它确实适用于静态文件。即:
localhost/media/path/to/file而不是localhost:1337/media/path/to/file