Nginx: stat()失败(13: 拒绝许可)

我正在使用默认配置,同时添加安装在 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。我不知道还需要设置什么。

259484 次浏览

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

症状:

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

原因:

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

我刚刚在 CentOS 7的盒子上遇到了同样的问题。

看来我打到了 selinux。将 selinux 转换为允许模式(setenforce permissive)目前已经解决了这个问题。我会想办法回来的。

在 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

更新: 这只是我在使用数字海洋的虚拟 Linux 服务器,或者他们称之为 水滴的时候学到的一点小技巧。使用 SELinux 需要大量的 RAM。最有可能的情况是,您无法在内存小于2GB 的小液滴上运行 管理 SELinux。

你可能有安全增强式Linux 运行,所以添加规则。 我有13个权限错误,即使权限设置和用户存在. 。

chcon -Rt httpd_sys_content_t /username/test/static

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

root /var/www/<your static folder>

在 ngix.conf 中(或者/etc/nginx/sites- 可用/default)

这在 ubuntu 上对我很有用,但是我想对于其他发行版也不会有太大的不同。

希望能有帮助。

我有同样的问题,我正在使用 Plesk Onyx 17和 Centos7。我可以在代理 _ error _ log 中受影响域的日志下看到这个错误。/var/www/vhosts/中的所有 dirs/文件都属于各自的用户(域所有者) ,您可以看到所有这些文件都位于 psacln 组中。所以解决方案就是把 nginx 也加到这个组里,这样他就可以看到他需要什么:

usermod -aG psacln nginx

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

Nginx 需要对通向站点根目录的所有目录拥有 + x 访问权。

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

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

我遇到了这个问题,我解决了这个问题,给 nginx 用户和组像这样的权限:

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

在我的例子中,提供这些文件的文件夹是一个到另一个文件夹的符号链接

ln -sf /origin /var/www/destination

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

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

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

您还可以添加将运行 nginx 的用户:

user root;

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

我终于找到了出路。简而言之,假设您的用户名是 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帐户的持有者与您打开目录访问的用户不同时,才是安全漏洞,但在我的情况下,我是双方的持有者,这是在本地上下文中。

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

我就是这么解决的

sudo chmod o+x /home/ec2-user

要检查默认的 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

enter image description here

解决方案:

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