nginx: open() XXX failed (2: No such file or directory)

nginx by Xudong Zhang @ 2015-11-12 15:25:12

我想让nginx来处理放在项目开发目录的一些静态文件, 我的配置大概如下:

server {
...
    location ^~ /static/ {
        root /root/git/app;
        if ($query_string) {
            expires max;
        }
    }
}

然后浏览器访问有问题,error.log文件里面有大致如下的错误

open "/root/git/app/static/js/app.js" failed (2: No such file or directory)

我知道是目录权限的问题,但是我把该目录设置为www-data(nginx使用的用户名)也没有用, 设置为777也不行,咋回事?


这确实是权限的问题,但是问题的关键很可能是你没有static目录的父目录的rx权限,比如/root.

举个例子吧,/是一栋楼,/root是第十层,/root/git/app/static是第十层的某个房间,比如1001,你有这个房间的所有权,但是你没有进入第十层的权限(比如门卡什么的),所以访问不了那个房间.

你可以ls -al /看下/root的权限,默认应该是drwx------,其他用户没法进入或者查看该目录.

或者sudo -u www-data ls /root或者sudo -u www-data stat /root/git/app/static来看www-data这个用户能不能查看那个目录.

最后,解决的办法,你需要确保www-data这个用户对static目录的每一个父目录都有x的权限,可以这样

#chmod a+x /root
#chmod a+x /root/git
#chmod a+x /root/git/app
by Xudong Zhang @2015-11-12 15:38:44.417 +0800 CST


我来回答

Markdown格式技巧

  • 行尾添加2个空格或者添加一个空行就能换行
  • 斜体: *hello* 或者 _world_
  • 加粗: **hello** 或者 __world__
  • 代码块: 添加空行,然后代码缩进4个空格
  • 特殊字符: 用\避免转义;\*就是*本身
  • python: `__name__`可以以代码形式输出__name__
  • 一个简单的例子

切换到移动版