使用 Django/nginx 我的静态内容出现 404 错误是什么原因?

What am I getting 404 errors with my static content using Django/nginx?

None 我的媒体或静态内容出现,每次加载页面时我都会看到所有这些内容的 404 错误。

来自我的 nginx/sites-enabled 的片段(下面这些位置是我希望放置静态和媒体内容的理想位置)

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

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

我的 settings.py

中所有 'static' 相关内容的片段
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",

更改 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 设置以指向有效 url:

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

您的 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

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

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

那些象征性的 link 也是为什么您 总是 需要 运行 collectstatic 在您对静态文件进行更改后文件。否则,nginx 将找不到 link 告诉实际文件所在的位置,并且无法提供该文件。