关于centos:Nginx 403禁止所有文件

Nginx 403 forbidden for all files

我在Centos5上安装了nginx和php-fpm,但是我很难让它为我的任何文件服务——不管是php还是php。

nginx以www-data:www-data的形式运行,默认的"欢迎使用epel上的nginx"站点(由具有644权限的root:root拥有)加载良好。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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个文件权限,但此网站无法提供任何内容-

1
 [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得到403,但是我看到的大多数帖子要么涉及到Ruby/Passenger的更复杂的设置(在过去我实际上已经成功了),要么只在涉及上游php-fpm时接收到错误,所以它们似乎没有什么帮助。

我在这里做了些傻事吗?


一个经常被忽略的权限要求是,用户需要文件的每个父目录中的X权限来访问该文件。请检查/、/home、/home/demo等的权限,以获取www数据x访问权限。我猜/home可能是770,WWW数据不能通过它访问任何子目录。如果是,请尝试chmod o+x/home(或dir拒绝该请求的任何内容)。

编辑:为了方便地显示路径上的所有权限,可以使用namei -om /path/to/check


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

要检查SELinux是否正在运行:

1
# getenforce

要禁用SELinux直到下次重新启动:

1
# setenforce Permissive

重新启动nginx,查看问题是否依然存在。要允许nginx为您的www目录服务(在测试之前,请确保重新打开selinux)。即,setenforce Enforcing)

1
# chcon -Rt httpd_sys_content_t /path/to/www

详情请参阅我的答案。


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

在nginx.conf中

1
2
worker_processes 4;
user username;

用Linux用户名更改'user name'。


我得到了这个错误,最后用下面的命令解决了它。

1
restorecon -r /var/www/html

这个问题是由你从一个地方到另一个地方的mv信号引起的。当您移动它时,它会保留原始的selinux上下文,因此如果您在/home或/tmp中解开某些内容,它会得到一个与其位置匹配的selinux上下文。现在,您可以将其转发到/var/www/html,并在上下文中声明它属于/tmp或/home,策略不允许httpd访问这些文件。

如果cp文件而不是mv文件,则selinux上下文将根据要复制到的位置而不是从何处来分配。运行restorecon会将上下文放回其默认值并对其进行修复。


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


老问题,但我也有同样的问题。我试过上面的每一个答案,都没用。不过,修复它的方法是删除域,然后重新添加。我正在使用Plesk,在域已经存在之后安装了nginx。

首先对/var/www/backups进行了本地备份。所以我可以很容易地把文件复制回去。

奇怪的问题……


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

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

这将解决权限问题。


如果您使用的是php,请确保服务器块中的indexnginx指令包含index.php:

埃多克斯1〔8〕

有关更多信息,请签出官方文档中的index指令。


我们有同样的问题,使用Plesk Onyx 17。解决方案不是搞砸权限等,而是将nginx用户添加到psacln组中,其中所有其他域所有者(用户)都是:

1
usermod -aG psacln nginx

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

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

1
usermod -aG psaserv apache

之后别忘了重启Plesk中的Apache和nginx!(并使用ctrl-f5重新加载页面)


在这个问题上,我错误地运行了setfacl命令,使自己陷入了一个微小的变化。我跑了:

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

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

1
sudo setfacl -b /home/foo/bar

然后nginx可以访问这些文件。


我也面临同样的问题,但以上的解决办法没有帮助。

所以,经过一番斗争,我发现塞斯塔斯将强制执行封锁所有港口的措施,并将其设置为允许,所有问题都得以解决。

1
sudo setenforce 0

希望这能帮助像我这样的人。