Nginx:stat()失败(13:权限被拒绝)


103

我在使用ubuntu 12.04机器上添加安装了nginx的特定目录时使用默认配置。

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                root /username/test/static;
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
...

...
}

我只想要一个简单的静态nginx服务器来提供该目录之外的文件。但是,检查error.log我看到

2014/09/10 16:55:16 [crit] 10808#0: *2 stat() "/username/test/static/index.html" failed (13: Permission denied), client:, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "domain"
2014/09/10 16:55:16 [error] 10808#0: *2 rewrite or internal redirection cycle while internally redirecting to "/index.html

我已经做完chown -R www-data:www-data/username/test/static,将它们设置为chmod 755。我不知道还需要设置什么。


3
检查www-data用户是否可以cd访问/username/test/static目录:sudo -u www-data cd /username/test/static
Maciej Sz 2014年

我的权限被拒绝,但是当我执行ls -l时,它表明其设置为www-data用户
user299709 2014年

2
/ username是否在cryptofs上?我的网站所在的/ home / username文件夹存在完全相同的问题。如果我将其移出cryptofs,则一切正常。对于我来说仍然没有解决方案……
Georgi

Answers:


193

Nginx在目录中运行,因此,如果您不能cd从Nginx 用户访问该目录,则它将失败(stat日志中的命令也是如此)。确保www-user可以cd一直到/username/test/static。您可以stat通过运行来确认将会成功还是失败

sudo -u www-data stat /username/test/static

就您而言,/username目录可能是这里的问题。通常www-data没有cd访问其他用户主目录的权限。

在这种情况下,最好的解决方案是添加www-datausername组:

gpasswd -a www-data username

并确保该username组可以输入路径中的所有目录:

chmod g+x /username && chmod g+x /username/test && chmod g+x /username/test/static

为了使更改生效,请重新启动nginx

nginx -s reload

这是否意味着对于根目录下添加的每个新目录,都必须对新目录执行chmod?
钱琛

2
@ElgsQianChen请记住,这是操作系统级别的权限系统,因此在POSIX系统中,它取决于您的umask。如果您需要一个更通用的解决方案,而不需要chmod每个新目录,那么就有一个解决方案。它需要反向组关联(usernamewww-data组)和使用的setgid。欢迎发布新问题以进行更详细的描述,我很乐意回答。
Maciej Sz 2015年

如果我的路径在/ root /目录中怎么办?在/ root上执行chmod g + x是否安全?并将www-data添加到根组?
Oleg Abrazhaev '16

在Fedora 24上,我的问题来自... ACL权限...另一层...是的!
雷·福斯

1
我的nginx用户可以访问我的网站目录,但是仍然显示错误日志上的权限被拒绝。
拉希尔·瓦齐尔

88

我在CentOS 7机器上遇到了同样的问题。

似乎我会碰到selinux。目前,将selinux置于宽松模式(setenforce permissive)可以解决该问题。我将尝试并进行适当的修复。


4
这是我最近3天试图了解的确切“未记录”行为...
Achilles 2015年

2
这是关于这种行为的文章:axilleas.me/en/blog/2013/…–
阿喀琉斯(Achilles)

2
所以,我回到了自己...这次,我发现我将有问题的文件从主目录复制到html目录,并更新了所有权。同样的问题在2015年...更好的解决办法: ls -Z myFile.js将展示SELinux上下文:-rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js 利用chcon -v --type=httpd_sys_content_t myFile改变SELinux的内容。
安德鲁·理查德·米勒

2
对; 我遇到过同样的问题。sudo setenforce 0为我修复它。
重载

1
请注意,如果要完全禁用selinux,则需要将SELINUX值更改为disabledin /etc/selinux/config,然后重新启动。设置为时permissive,它仍然可以在后台运行检查(使用有价值的CPU),但不执行任何操作。
奥利弗·塔平

76

Nginx需要在通向站点根目录的所有目录上具有+ x访问权限。

确保在指向站点根目录的路径中的所有目录上都有+ x。例如,如果站点根目录是/ home / username / siteroot:

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot

13
经过六个小时的绝望搜索...发现尸体提到了这个,但是你!谢谢!
Walid Ammar '18

3
非常感谢!花了几个小时试图使它起作用,并遇到了各种各样的答案,简直不敢相信它是如此简单!
Eric Groom

2
这项工作对我来说很好,centos 7,php fpm 7.2(selinux已经关闭)
anhduc.bkhn 19-4-27

1
谢谢!真不敢相信,这是我一直以来要做的一切!
令人兴奋的

1
谢谢,完美!
Softsofter

32

在CentOS 7.0上,我遇到Access Deined了SELinux引起的此问题,这些步骤解决了该问题:

yum install -y policycoreutils-devel
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp

更新:只是我在使用digitalocean的虚拟Linux服务器或它们称为Droplet时学到的一个旁注。使用SELinux需要相当数量的RAM。很有可能您将无法在内存少于2GB的Droplet上运行和管理 SELinux。


2
非常感谢。它确实解决了我的问题(同样在CentOS 7上),但是后来我在其他地方被第二次拒绝所阻止,因此诉诸于setenforce 0。但是,回顾此解决方案的实际作用时,我意识到我需要重新运行命令以更新nginx用户的权限。这似乎可行,我可以将SELinux重新设置为强制执行。
danj1974

好吧,这可能为时已晚。不过,值得一提的是,当您保留SELinux强制执行时;必须记住,像Nginx这样的软件会在SELinux中插入自己的规则集,例如默认端口,默认路径,对路径的读/写访问等。如果您不想遇到任何麻烦,则必须遵循这些规则(例如将HTML / PHP文件放入/ var / www),否则准备克服SELinux上下文中深层的问题。[CentOS <8]可能会有所帮助:getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
阿基里斯


4

症状:

无法将图片上传到WordPress媒体库。

原因:

(CentOS的) yum update

错误:

2014/10/22 18:08:50 [crit] 23286#0: *5332 open() "/var/lib/nginx/tmp/client_body/0000000003" failed (13: Permission denied), client: 1.2.3.4, server: _, request: "POST /wp-admin/media-new.php HTTP/1.1", host: "example.com", referrer: "http://example/wp-admin/media-new.php"

解:

chown -R www-data:www-data /var/lib/nginx


2

默认情况下,安装nginx时,静态数据将位于/ var / www / html中。因此,您只需将静态文件夹复制到/ var / html /并设置

root /var/www/<your static folder>

在ngix.conf中(或/ etc / nginx / sites-available / default)

这在ubuntu上对我有用,但是我想对于其他发行版应该没有太大不同。

希望能帮助到你。


2

将您的nginx.conf user属性更改为www-static文件所有者。

#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user your_user_name;

# same other config

1

我遇到了这个问题,我解决了这个问题,以向nginx用户授予权限并进行如下分组:

chown -R nginx:nginx /username/test/static

1

就我而言,用于提供文件的文件夹是指向另一个文件夹的符号链接,

ln -sf /origin /var/www/destination

即使权限(用户和组)在目标文件夹(符号链接)上正确无误,我仍然遇到错误,因为Nginx还需要对原始文件夹整体的层次结构拥有权限。


1

我终于找到了方法。简而言之,假设您的用户名是,joe并且您在个人文件系统下拥有一个网站/home/joe/path/to/website

您实际上必须告诉系统nginx您的好朋友。
nginxjoe组:

sudo gpasswd -a nginx joe

之后,如果仍然无法使用,请检查/home/joe目录的正确访问权限。这可能是nginx无法访问文件的原因,因为即使他现在是您的朋友,您也必须打开他的房门:

sudo chmod g+x /home/joe

而已。实际上,这就是使Nginx可以访问本地文件的所有操作:)

我认为此方法没有安全性问题,因为nginx它具有很高的权限,只有管理员才能更改组。nginx现在可以读取joe目录中的内容。如果nginx帐户的持有人与您打开目录访问的用户不同,则仅是安全漏洞,但是在我的情况下,我是双方的持有人,这是在本地情况下。


0

我遇到了同样的问题,我在Centos7中使用了Plesk Onyx 17。我可以在受影响域的日志下的proxy_error_log中看到此错误。/ var / www / vhosts /中的所有目录/文件均由各自的用户(域所有者)拥有,您可以看到它们都在psacln组中。因此,解决方案是将nginx也添加到该组中,这样他就可以看到自己的需求:

usermod -aG psacln nginx

确实,重新启动nginx并使用Ctrl + F5重新加载页面。


0

我找到了一种解决方法:将文件夹移动到nginx配置文件夹,在本例中为“ / etc / nginx / my-web-app”。然后将权限更改为root用户“ sudo chown -R root:root” my-web-app“。


0

您还可以添加哪个用户将运行Nginx。在nginx.conf文件中,进行以下更改:

user root;

您可以将以上行添加为nginx conf中的第一行。您可以输入有权在该目录中写入的任何用户的名称。


0

这通常是特权问题...对我来说,这是因为我使用/ root / **作为nginx根目录,因此需要更高的特权。一种简单的方法是将项目移到您自己创建的目录中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.