在 nginx 中获取静态文件失败,出现 404
Posted
技术标签:
【中文标题】在 nginx 中获取静态文件失败,出现 404【英文标题】:Fetching static files failed with 404 in nginx 【发布时间】:2014-12-01 23:51:21 【问题描述】:我现在正在 ubuntu 12 上部署一个带有 nginx 和 gunicorn 的 django 应用程序。
我配置nginx虚拟主机文件如下:
server
listen 80;
server_name mydomain.com;
access_log /var/log/nginx/gunicorn.log;
location /
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location /static/
root /var/www/django/ecerp/erp/static/;
我可以很好地请求django,但是当请求静态文件时,它会以404状态响应。
我确定静态文件的根路径是正确的。
谁能帮忙?
【问题讨论】:
wiki.nginx.org/Pitfalls#Root_inside_Location_Block。 nginx.org/r/root 我还要确保您的 nginx 用户有权访问该目录。祝你好运 @pztrick 没有权限问题。我将其更改为 777。现在返回 404 而不是 403。 我自己的配置使用alias
指令而不是root
。我还将静态和媒体路径放置在裸location /
之前。也许它首先路由到location /
匹配?
@pztrick,不是订单问题,我已经解决了,应该删除多余的static/
!
【参考方案1】:
您应该使用alias
而不是root
。 root
将尾随 URL 部分附加到您的本地路径(例如 http://test.ndd/trailing/part,它将添加 /trailing/part 到您的本地路径)。取而代之的是,alias
完全符合您的要求:当请求 http://test.ndd/static/ 时,/static 将准确映射到您的别名,而无需再次附加 static。
例如:
location /static
alias /var/www/django/ecerp/erp/static/;
如果文件/var/www/django/ecerp/erp/static/foo.html
存在,那么转到/static/foo.html
将返回其内容。
【讨论】:
【参考方案2】:TL;DR - 你应该检查你的文件权限
偶然发现了这个问题,我已经在使用 alias
而不是 root,所以虽然现有答案是正确的,但以下内容可能对其他人有用。
在我的情况下,解决相同症状的方法是 static/
中的文件以 root
为所有者。
一个简单的chown www-data:www-data .
解决了问题,没有更多404
。
【讨论】:
我也用 chmod 试过这个。 nginx 对文件实际需要哪个权限?只读似乎还不够。完全访问似乎有点过头了。 @ST-DDT 从 Nginx 访问root
文件不是一个好主意,无论他们可能拥有什么权限。在这里使用chown
是一个更好的选择。以上是关于在 nginx 中获取静态文件失败,出现 404的主要内容,如果未能解决你的问题,请参考以下文章