使用Django / nginx我的静态内容有404错误?

时间:2015-02-02 01:47:43

标签: django nginx

我的媒体或静态内容均未显示,每次加载页面时,我都会看到404错误。

来自我的nginx / sites-enabled的

片段(下面这些位置理想情况下我想要我的静态和媒体内容)

location /media {
alias /home/django/django/proj/proj/media;
}

location /static {
alias /home/django/django/proj/proj/static;
}

我的settings.py

中与“静态”相关的所有内容的摘录
MEDIA_ROOT = os.path.join(PACKAGE_ROOT, "media")

MEDIA_URL = "/media/"

STATIC_ROOT = os.path.join(PACKAGE_ROOT, "static")

STATIC_URL = "/static/"

# Additional locations of static files
STATICFILES_DIRS = [
    os.path.join(PACKAGE_ROOT, "static"),
]

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = [
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",

2 个答案:

答案 0 :(得分:1)

您的nginx别名必须与您的STATIC_ROOTMEDIA_ROOT设置相匹配,否则nginx将不知道在哪里可以找到这些文件。

location /media {
    alias /home/django/django/proj/proj/site_media/media;
}

location /static {
    alias /home/django/django/proj/proj/site_media/static;
}

如果这不起作用,请检查nginx尝试在错误日志中查找文件的位置。

提供媒体文件非常简单:您只需要告诉nginx对MEDIA_URL + '<filename>'发出的请求应该提供名为MEDIA_ROOT + '<filename>'的文件。这些是您在nginx中的locationalias设置。

静态文件有点复杂。 Django使用静态文件的方式是,manage.py collectstatic使用您的STATICFILES_FINDERS来查找所有静态文件。这包括STATICFILES_DIRS目录中的所有文件。 STATIC_ROOT目录中的symbolic link具有相同的相对名称。

由于您无法使用与文件链接完全相同的完整路径+名称创建符号链接,因此您的STATIC_ROOT需要与STATICFILES_DIRS不同。如果所有静态文件都驻留在特定于应用程序的静态文件夹中,则可以省略STATICFILES_DIRS。但是,STATIC_ROOT设置是必需的,因为Django 需要所有符号链接的文件夹才能收集文件。

这些符号链接是一种允许第三方应用程序(不在项目根目录中)仍然提供静态文件的方法。即使您的静态文件可以遍布整个地方,例如在使用python包的文件夹中,您只需要为静态文件的一个特定位置配置nginx。这极大地简化了您的服务器配置。

这些符号链接也是始终在您对静态文件进行更改后需要运行collectstatic的原因。否则,nginx将找不到指示实际文件所在位置的链接,并且无法提供该文件。

答案 1 :(得分:0)

更改nginx配置中的路径(注意site_media部分)?

location /media {
    alias /home/django/django/proj/proj/site_media/media;
}

location /static {
    alias /home/django/django/proj/proj/site_media/static;
}

并将MEDIA_URL设置更改为指向有效网址:

MEDIA_URL = "/media/"
STATIC_URL = "/static/"