Nginx 403禁止所有文件

时间:2011-07-22 19:53:52

标签: nginx centos http-status-code-403 php

我在CentOS 5机器上安装了带有PHP-FPM的nginx,但我很难让它为我的任何文件服务 - 无论是否为PHP。

Nginx以www-data:www-data运行,默认情况下“欢迎使用EPEL上的nginx”网站(由root拥有:具有644权限的root)加载正常。

nginx配置文件有 / etc / nginx / sites-enabled / * .conf,的include指令,我有一个配置文件 example.com.conf ,因此:

server {
 listen 80;

 Virtual Host Name
 server_name www.example.com example.com;


 location / {
   root /home/demo/sites/example.com/public_html;
   index index.php index.htm index.html;
 }

 location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  PATH_INFO $fastcgi_script_name;
  fastcgi_param  SCRIPT_FILENAME  /home/demo/sites/example.com/public_html$fastcgi_script_name;
  include        fastcgi_params;
 }
}

尽管public_html归www-data所有:www-data拥有2777个文件权限,但此网站无法提供任何内容 -

 [error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", host: "www.example.com"

我发现很多其他帖子的用户从nginx获得403s,但我见过的大部分都涉及使用Ruby / Passenger进行更复杂的设置(过去我实际上已成功)或者只是在收到错误时涉及上游PHP-FPM,因此它们似乎没什么帮助。

我在这做过傻事吗?

11 个答案:

答案 0 :(得分:314)

经常被忽视的一个权限要求是用户在文件的每个父目录中需要x权限才能访问该文件。检查/,/ home,/ home / demo等对www-data x access的权限。我的猜测是/ home可能是770而www-data不能通过它来获取任何子目录。如果是,请尝试chmod o + x / home(或任何dir拒绝请求)。

编辑:要轻松显示路径上的所有权限,您可以使用namei -om /path/to/check

答案 1 :(得分:273)

如果在验证父文件夹的权限后仍然看到permission denied,则可能 SELinux 限制访问权限。

检查SELinux是否正在运行:

# getenforce

要在下次重启之前禁用SELinux:

# setenforce Permissive

重新启动Nginx并查看问题是否仍然存在。允许nginx为你的www目录提供服务(确保在测试之前重新启用SELinux。即,setenforce Enforcing

# chcon -Rt httpd_sys_content_t /path/to/www

有关详细信息,请参阅我的answer here

答案 2 :(得分:49)

我通过添加用户设置解决了这个问题。

在nginx.conf中

worker_processes 4;
user username;

更改用户名'用linux用户名。

答案 3 :(得分:28)

我收到了这个错误,我终于用下面的命令解决了它。

restorecon -r /var/www/html

当你从一个地方到另一个地方的东西时会引起这个问题。当你移动它时,它会保留原始的selinux上下文,所以如果你在/ home或/ tmp中解压缩它,它会得到一个匹配它的位置的selinux上下文。现在你将它转移到/ var / www / html,它会将上下文称为属于/ tmp或/ home,并且策略不允许httpd访问这些文件。

如果你是cp文件而不是mv,那么selinux上下文会根据你要复制到的位置而不是来自它的位置来分配。运行restorecon会将上下文恢复为默认值并修复它。

答案 4 :(得分:21)

我尝试过不同的情况,只有当所有者设置为nginx(chown -R nginx:nginx "/var/www/myfolder")时才开始按预期工作。

答案 5 :(得分:1)

老问题,但我有同样的问题。我试过上面的每个答案,没有任何效果。为我修复它的原因是删除域名并再次添加域名。我正在使用Plesk,我已经安装了Nginx域名。

首先对/ var / www / backups进行了本地备份。所以我可以轻松地复制文件。

奇怪的问题....

答案 6 :(得分:0)

我错误地运行了setfacl命令,在这个问题上挖了一个轻微的变种。我跑了:

sudo setfacl -m user:nginx:r /home/foo/bar

我放弃了这条路线,转而将nginx添加到foo组,但该自定义ACL阻止了nginx尝试访问该文件。我通过运行清除它:

sudo setfacl -b /home/foo/bar

然后nginx能够访问这些文件。

答案 7 :(得分:0)

我们遇到了同样的问题,使用了Plesk Onyx 17.解决方案是将nginx用户添加到psacln组中,其中所有其他域所有者(用户)都是:

usermod -aG psacln nginx

现在,nginx有权访问.htaccess或正确显示内容所需的任何其他文件。

另一方面,还要确保Apache在psaserv组中,以提供静态内容:

usermod -aG psaserv apache

不要忘记在Plesk之后重启Apache和Nginx! (并使用Ctrl-F5重新加载页面)

答案 8 :(得分:0)

如果您使用的是PHP,请确保服务器块中的 <a href="http://xray840.startdedicated.net/quicksilver/Genres/Country/Blake%20Shelton/Blake%20Shelton/01%20Every%20Time%20I%20Look%20at%20You.mp3" download>Download</a> NGINX指令包含index.php:

index

有关详细信息,请查看官方文档中的index directive

答案 9 :(得分:0)

如果您使用的是SELinux,只需键入:

sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/

这将解决权限问题。

答案 10 :(得分:-1)

我也遇到了同样的问题,但是上述解决方案没有帮助。

因此,经过大量的努力,我发现 sestatus 被设置为强制执行哪些操作来阻塞所有端口,并将其设置为允许所有问题都得到解决。

sudo setenforce 0

希望这对像我这样的人有帮助。

相关问题