找不到静态文件 (gunicorn)

Static files are not found (gunicorn)

我知道这个问题已经被经常问到了。但是假设的解决方案似乎对我没有帮助。

这是我对静态文件的 Nginx 定义

    location /static/ {
        alias /data/atsi_webapp/ATSi_WebApp/static;
    }

这是我的 Django 设置

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

我已经运行做了

python manage.py collectstatic

但是,我得到

Not Found: /static/js/xxxx.js

我认为你的 nginx 声明导致了这个问题。

你能试试这个吗:

location /static/ {
    # static files
    autoindex on;
    autoindex_exact_size off;
    # /data/atsi_webapp/ATSi_WebApp <-- may be in your case
    root /exact/path/to/project/folder;
}

而不是这个:

location /static/ {
    alias /data/atsi_webapp/ATSi_WebApp/static;
}

这个与 alias nginx 指令的不正确使用相关的错误在 SO 上被反复讨论。假设您有一个请求 http://example.com/static/js/script.js。由 nginx location /static/ { ... } 指令处理的此请求的规范化 URI 是 /static/js/script.js 当你在该位置有一个 alias /data/atsi_webapp/ATSi_WebApp/static; 指令时,nginx 从 URI 中删除 location 指令中使用的 /static/ 前缀,并将其余部分附加到 asias 指令中给出的路径。这个结果是 /data/atsi_webapp/ATSi_WebApp/staticjs/script.js 字符串的连接,这给了你错误的 /data/atsi_webapp/ATSi_WebApp/staticjs/script.js 文件 path/name。因此,当您使用 alias 指令时编写路径的一般规则是,当您在 location 指令中使用该斜杠时,请在路径中使用尾部斜杠,否则不要使用它。这意味着当您使用 alias 指令时,您应该使用

location /static {
    alias /data/atsi_webapp/ATSi_WebApp/static;
}

location /static/ {
    alias /data/atsi_webapp/ATSi_WebApp/static/;
}

静态文件的位置块(我认为第二个是首选)。

另一方面,root 指令将其路径附加到完整的请求 URI。作为 nginx 文档 states

When location matches the last part of the directive’s value:

location /images/ {
    alias /data/w3/images/;
}

it is better to use the root directive instead:

location /images/ {
    root /data/w3;
}

所以@Sabil 是对的(虽然缺少解释)你最好使用

location /static/ {
    root /data/atsi_webapp/ATSi_WebApp;
}

这种方式对于 http://example.com/static/js/script.js 请求路径 /data/atsi_webapp/ATSi_WebApp 将与规范化 URI /static/js/script.js 连接,前提是您正确 /data/atsi_webapp/ATSi_WebApp/static/js/script.js 文件 name/path。由于每个规范化的 URI 都以斜杠开头,因此您不需要将该斜杠添加到 root 指令参数的末尾,尽管添加它不会造成太多危害,因为在 [=15= 的末尾缺少必需的斜杠] 指令参数。