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

时间:2014-09-10 20:59:51

标签: ubuntu nginx

我在使用安装在我的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。我不知道还需要设置什么。

16 个答案:

答案 0 :(得分:152)

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

答案 1 :(得分:73)

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

似乎我打了selinux。将selinux置于许可模式(setenforce permissive)已经解决了这个问题。我会试着找回一个正确的解决方案。

答案 2 :(得分:30)

在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。它很可能就像你在一个内存小于2GB的小滴上运行并管理 SELinux一样。

答案 3 :(得分:30)

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

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

{% set myVar = false %}
{% if myVar is defined and not myVar %}
stuff
{% endif %}

答案 4 :(得分:18)

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

chcon -Rt httpd_sys_content_t /username/test/static

答案 5 :(得分:3)

症状:

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

答案 6 :(得分:2)

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

即可
root /var/www/<your static folder>

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

这对我在ubuntu上有用,但我想对其他发行版来说应该没什么不同。

希望它有所帮助。

答案 7 :(得分:2)

我终于找到了解决方法。简而言之,假设您的用户名是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帐户的持有人与您打开目录访问的用户不同,那么这仅是安全漏洞,但是在我的情况下,我是双方的持有人,这都是在本地环境中。

答案 8 :(得分:1)

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

制作
ln -sf /origin /var/www/destination

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

答案 9 :(得分:0)

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

usermod -aG psacln nginx

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

答案 10 :(得分:0)

我遇到了这个问题,我解决了它给nginx用户的权限,并将这样的内容分组:

with_rows

答案 11 :(得分:0)

我找到了一个解决方法: 将文件夹移动到nginx配置文件夹,在我的情况下&#34; / etc / nginx / my-web-app&#34;。 然后将权限更改为root用户&#34; sudo chown -R root:root&#34; my-web-app&#34;。

答案 12 :(得分:0)

将您的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 :(得分:0)

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

user root;

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

这就是我修复此问题的方式

sudo chmod o+x /home/ec2-user