【问题标题】:Nginx: stat() failed (13: permission denied)Nginx:stat()失败(13:权限被拒绝)
【发布时间】: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 则一切正常。对我来说仍然没有解决方案......

标签: ubuntu nginx


【解决方案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
                  

                  解决方案:

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

                  【讨论】:

                  • 经过 10 多个小时的搜索,这对我有用,谢谢
                  猜你喜欢
                  • 1970-01-01
                  • 2015-05-03
                  • 1970-01-01
                  • 2012-06-17
                  • 1970-01-01
                  • 2021-04-02
                  • 2014-03-24
                  • 2017-11-03
                  • 1970-01-01
                  相关资源
                  最近更新 更多