找不到静态文件 (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/static
和 js/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= 的末尾缺少必需的斜杠] 指令参数。
我知道这个问题已经被经常问到了。但是假设的解决方案似乎对我没有帮助。
这是我对静态文件的 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/static
和 js/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= 的末尾缺少必需的斜杠] 指令参数。