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
。如果您需要一个更通用的解决方案,不需要chmod
ing 每个新目录,那么就有一个解决方案。它需要反向组关联(username
到www-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:权限被拒绝)的主要内容,如果未能解决你的问题,请参考以下文章
FileSystemException:创建失败,路径 = '/storage/emulated/0/4k'(操作系统错误:权限被拒绝,errno = 13)颤振
SocketExpection:连接失败(os 错误权限被拒绝,errno=13),地址=encrypted-tbn0.gastatic.com,port=443 in flutter