当前位置: 首页>>技术教程>>正文


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。我不知道还需要设置什么。

最佳解决方案

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

次佳解决方案

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

好像我打了selinux。将selinux置于许可模式(setenforce permissive)已经解决了这个问题。我会试着找回适当的修复方法。

第三种解决方案

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

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

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

第四种方案

在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服务器,或者他们称之为Droplet时,我所学到的只是一个side-note。使用SELinux需要相当数量的RAM。最有可能的是,您将无法在RAM少于2GB的Droplet上运行和管理SELinux。

第五种方案

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

chcon -Rt httpd_sys_content_t /username/test/static

第六种方案

症状:

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

第七种方案

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

root /var/www/<your static folder>

在ngix.conf(或/etc /nginx /sites-available /默认)

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

希望能帮助到你。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7156.html,未经允许,请勿转载。