nginx 找不到静态文件(gunicorn)

c0vxltue  于 2023-05-16  发布在  Nginx
关注(0)|答案(2)|浏览(318)

我知道这个问题已经经常被问到了。但这些所谓的解决方案似乎对我没有帮助。
下面是我对静态文件的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

不过,我得到
404 Not Found:/static/js/xxxx.js

ckocjqey

ckocjqey1#

我认为是你的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;
}
camsedfj

camsedfj2#

这个错误与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文件路径/名称。所以当你使用一个alias指令的时候,写路径的一般规则是当你在location指令中有斜杠的时候,在路径中使用尾随的斜杠,否则不要使用它。这意味着当您使用alias指令时,您应该使用

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

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

静态文件的位置块(我认为第二个是首选)。
另一方面,root指令将其路径附加到完整的请求URI。正如nginx文档所述,
当location与指令值的最后一部分匹配时:

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

最好使用root指令:

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

所以@Sabil answer是正确的(尽管它缺少解释),你最好使用

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文件名/路径。由于每个规范化的URI都以斜杠开头,因此不需要将该斜杠添加到root指令参数的末尾,尽管添加它不会像在alias指令参数的末尾缺少必需的斜杠那样造成太大的伤害。

相关问题