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

Posted

技术标签:

【中文标题】Nginx:stat()失败(13:权限被拒绝)【英文标题】:Nginx: stat() failed (13: permission denied) 【发布时间】:2014-11-04 16:01:43 【问题描述】:

我在添加特定目录时使用默认配置,并在我的 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

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

【问题讨论】:

检查www-data用户是否可以cd/username/test/static目录:sudo -u www-data cd /username/test/static 我的权限被拒绝,但是当我执行 ls -l 时,它显示它设置为 www-data 用户 会不会是 /username 在 encryptfs 上?我的站点所在的 /home/username 文件夹遇到了完全相同的问题。如果我将其移出 encryptfs 则一切正常。对我来说仍然没有解决方案...... 【参考方案1】:

Nginx 在目录中运行,因此如果您不能从 nginx 用户cd 到该目录,那么它将失败(就像您日志中的stat 命令一样)。确保www-user 可以cd 一直到/username/test/static。您可以通过运行确认stat 将失败或成功

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

在您的情况下,/username 目录可能是这里的问题。通常www-data 没有cd 对其他用户主目录的权限。

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

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? @ElgsQianChen 请记住,这是操作系统级别的权限系统,因此在 POSIX 系统中,它取决于您的 umask。如果您需要一个更通用的解决方案,不需要chmoding 每个新目录,那么就有一个解决方案。它需要反向组关联(usernamewww-data 组)并使用setgid。随意发布一个新问题以获得更详细的描述,我很乐意回答。 如果我的路径在 /root/ 目录中怎么办?在 /root 上执行 chmod g+x 是否安全?并将 www-data 添加到根组? 在 Fedora 24 上,我的问题来自... ACL 权限...另一层...是的! 好吧,我的nginx 用户可以访问我的网站目录,但仍然在错误日志中显示权限被拒绝。【参考方案2】:

症状:

无法将图片上传到 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

【讨论】:

【参考方案3】:

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

似乎我会打 selinux。将 selinux 置于许可模式 (setenforce permissive) 目前已经解决了这个问题。我会尝试进行适当的修复。

【讨论】:

这是我过去 3 天试图了解的确切“未记录”行为... 这是一篇关于这种行为的帖子:axilleas.me/en/blog/2013/… 所以,我发现自己回到了这里......这次我发现我将有问题的文件从我的主目录复制到了 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 内容。 是的;我遇到过同样的问题。 sudo setenforce 0 为我修好了。 请注意,如果您希望完全禁用 selinux,则需要将 /etc/selinux/config 中的 SELINUX 值更改为 disabled,然后重新启动。当它设置为permissive 时,它仍然可以在后台运行检查(使用宝贵的 CPU),但不采取任何行动。【参考方案4】:

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

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

更新:只是我在使用 digitalocean 的虚拟 Linux 服务器(或者他们称之为 Droplets)时学到的一个旁注。使用 SELinux 需要相当数量的 RAM。您很可能无法在 RAM 小于 2GB 的 droplet 上运行和管理 SELinux。

【讨论】:

非常感谢。它确实解决了我的问题(也在 CentOS 7 上),但后来我被其他地方的第二次拒绝阻止了,所以求助于setenforce 0。然而,当回顾这个解决方案的实际作用时,我意识到我需要重新运行命令来更新 nginx 用户的权限。这似乎奏效了,我可以将 SELinux 重新设置为强制执行。 好吧,这可能有点太晚了。不过,值得一提的是,当您继续执行 SELinux 时;必须记住,像 Nginx 这样的软件会在 SELinux 中插入它们自己的一组规则,例如默认端口、默认路径、对路径的读/写访问权限等。如果您不想遇到任何麻烦,则必须遵循这些规则(例如将 HTML/PHP 文件放入 /var/www),否则准备克服源自 SELinux 上下文的深层问题。这可能会有所帮助 [CentOS getpagespeed.com/server-setup/nginx/nginx-selinux-configuration【参考方案5】:

您可能正在运行 Security-Enhanced Linux,因此请为此添加规则。 我有权限 13 错误,即使设置了权限并且用户存在..

chcon -Rt httpd_sys_content_t /username/test/static

【讨论】:

谢谢!在 CentOS 6.10 版(最终版)上工作。 在 CentOS 7.5.1804 (Core) 上工作。【参考方案6】:

默认情况下,静态数据,当你安装 nginx 时,将在 /var/www/html 中。 所以你可以把你的静态文件夹复制到 /var/html/ 并设置

root /var/www/<your static folder>

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

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

希望对您有所帮助。

【讨论】:

【参考方案7】:

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

usermod -aG psacln nginx

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

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

经过 6 小时的拼命搜索……发现尸体提到了这个,但你!谢谢! 非常感谢!花了几个小时试图让它工作并遇到各种各样的答案,不敢相信它是如此简单! 这对我来说很好,centos 7,php fpm 7.2(selinux 已经关闭) 谢谢!不敢相信这就是我一直以来要做的一切! 谢谢你,完美!【参考方案9】:

我遇到了这个问题,我解决了它给 nginx 用户和组的权限,如下所示:

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

【讨论】:

实际工作,注意如果你在 docker 容器中运行 nginx 并且你的 nginx.conf 文件以用户 nginx 开头;所以在你的dockerfile中你应该复制 ./nginx.conf /etc/nginx/nginx.conf RUN chown -R nginx:nginx /usr/share/nginx/html/ 给你的用户写权限【参考方案10】:

在我的例子中,提供文件的文件夹是指向另一个文件夹的符号链接,由

ln -sf /origin /var/www/destination

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

将您的 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

【讨论】:

【参考方案13】:

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

user root;

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

【讨论】:

【参考方案14】:

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

您实际上必须告诉系统nginx 是您的朋友。 将nginx 放入joe 组:

sudo gpasswd -a nginx joe

如果还是不行,检查/home/joe目录的权限。这可能是 nginx 无法访问文件的原因,因为即使他现在是你的朋友,你也必须为他打开你家的门:

sudo chmod g+x /home/joe

就是这样。这就是让 nginx 访问本地文件所需要做的全部工作:)

我认为这种方法没有安全问题,因为nginx 是高权限,只有管理员可以更改组。 nginx 现在可以读取 joe 目录中的内容。如果 nginx 帐户的持有者与您打开目录访问的用户不同,这只是一个安全漏洞,但在我的情况下,我是双方的持有者,即在本地环境中。

【讨论】:

将主文件夹更改为可执行文件 (chmod g+x) 在我的情况下有效。【参考方案15】:

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

【讨论】:

【参考方案16】:

我就是这样解决这个问题的

sudo chmod o+x /home/ec2-user

【讨论】:

这对我有用。但是最好对这个问题进行更多解释。【参考方案17】:

检查默认 Nginx 用户:

sudo ps aux| grep nginx

你会得到这样的输出:

root       69558  0.0  0.0  66276  1708 ?        Ss   10:14   0:00 
nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data   69559  0.0  0.1  66516  5540 ?        S    10:14   0:00 nginx: worker process
www-data   69560  0.0  0.1  66516  6944 ?        S    10:14   0:00 nginx: worker process
root       69794  0.0  0.0   8168   672 pts/1    S+   10:19   0:00 grep --color=auto nginx

另外,使用您选择的任何文本编辑器检查 nginx.conf 文件:我将使用 vim:

vim /etc/nginx/nginx.conf

解决方案:

    将 nginx.conf 文件中的 www-data 用户更改为 root,以防您是 root 用户。
    第二种解决方案是将用户 www-data 添加到根组。

【讨论】:

经过 10 多个小时的搜索,这对我有用,谢谢

以上是关于Nginx:stat()失败(13:权限被拒绝)的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 错误:(13:权限被拒绝)同时连接到上游

nginx 错误:(13:权限被拒绝)同时连接到上游)

Nginx:Ubuntu上的nginx权限被拒绝[关闭]

FileSystemException:创建失败,路径 = '/storage/emulated/0/4k'(操作系统错误:权限被拒绝,errno = 13)颤振

403 nginx 错误 - 权限被拒绝

SocketExpection:连接失败(os 错误权限被拒绝,errno=13),地址=encrypted-tbn0.gastatic.com,port=443 in flutter