python - 找不到静态文件(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
但是,我得到
未找到:/static/js/xxxx.js
解决方案
与错误使用alias
nginx 指令相关的此错误在 SO 上一遍又一遍地讨论。假设您有一个请求http://example.com/static/js/script.js
。location /static/ { ... }
由 nginx指令处理的此请求的规范化 URI是/static/js/script.js
当您在该位置有alias /data/atsi_webapp/ATSi_WebApp/static;
指令时,nginx 从 URI 中删除指令中/static/
使用的前缀location
,并将其余部分附加到asias
指令中给出的路径。这个结果是/data/atsi_webapp/ATSi_WebApp/static
和js/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的答案是正确的(虽然它缺少解释),你最好使用
location /static/ {
root /data/atsi_webapp/ATSi_WebApp;
}
给定正确的文件名/路径,对于http://example.com/static/js/script.js
请求的这种方式,路径/data/atsi_webapp/ATSi_WebApp
将与规范化的 URI 连接。由于每个规范化的 URI 都以斜杠开头,因此您不需要将该斜杠添加到指令参数的末尾,尽管添加它不会像在指令参数末尾缺少必需的斜杠那样造成如此多的危害。/static/js/script.js
/data/atsi_webapp/ATSi_WebApp/static/js/script.js
root
alias
推荐阅读
- apache - 使用 Apache 将更新部署到 install4j 应用程序的金丝雀
- reactjs - 反应,获取天气 Aync 等待错误
- laravel - 使用许多选择器 laravel 将照片上传到数据库
- python - 如何引用数据文件目录 Pyinstaller/auto-py-to-exe
- angular-cli - NGCC 失败。在 NgccProcessor.process (Angular\node_modules\@ngtools\webpack\src\ngcc_processor.js:139:19)
- c - 将整数转换为新的浮点格式
- javascript - JQuery:过滤不匹配多个属性的div
- r - 使用 TSA::arima 和 stats::arima 的动态时间序列
- regex - Kafka 转换忽略正则表达式
- typescript - Typescript - 从内部函数中提取返回类型