Nginx 403禁止所有文件

Ang*_*and 184 php centos nginx http-status-code-403

我在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;
 }
}
Run Code Online (Sandbox Code Playgroud)

尽管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"
Run Code Online (Sandbox Code Playgroud)

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

我在这做过傻事吗?

kol*_*ack 322

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

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

  • 同样在这里.在我安装的CentOS 6上,/ home/user dirs默认设置为700. (6认同)
  • 它没有任何不同.apache在父目录上不需要x权限的唯一原因是它是否以root身份运行. (3认同)
  • 这个人也谈论它:(`chmod -4 + x / mypath`为我工作)http://nginxlibrary.com/403-forbidden-error/ (2认同)
  • 我真的希望我4个小时前读过这篇文章。谢谢。 (2认同)

Kur*_*urt 286

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

要检查SELinux是否正在运行:

# getenforce
Run Code Online (Sandbox Code Playgroud)

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

# setenforce Permissive
Run Code Online (Sandbox Code Playgroud)

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

# chcon -Rt httpd_sys_content_t /path/to/www
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅我的答案

  • 这是CentOS 7上的默认行为. (10认同)
  • 我和其他评论过的人在一起.我准备把电脑扔出窗外.Nginx配置正确,权限正确设置,我甚至做了所有777仍然得到权限被拒绝错误. (4认同)
  • 更好的 SELinux 命令是: *semanage fcontext -a -t httpd_sys_rw_content_t "/path/to/www(/.*)?"* 和 *restorecon -v /path/to/www* 这将自动提供您的所有文件在此路径中获得正确的 SELinux 权限。添加新文件时也是如此。如果您只需要阅读权限,请使用httpd_sys_content_t。 (2认同)
  • 在Centos 7(SELinux启用)上,对我来说最简单的修复是`setsebool httpd_read_user_content on`(对于从主目录托管的静态文件,chmod到世界可读) - 虽然我猜@ KapiteinWitbaard的方法更安全. (2认同)

And*_*son 53

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

在nginx.conf中

worker_processes 4;
user username;
Run Code Online (Sandbox Code Playgroud)

用linux用户名更改'username'.

  • 我相信这个答案比接受的答案更安全.您不必去处理主文件夹(可能包含敏感信息)的权限,如果您正在使用nginx进行开发,则可以避免将奇怪的文件权限上传到SCM. (4认同)
  • 还必须添加用户组:user usegroup. (2认同)

jsi*_*ina 35

我有这个错误,我终于用下面的命令解决了它.

restorecon -r /var/www/html
Run Code Online (Sandbox Code Playgroud)

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

如果您使用cp文件而不是mv它们,则会根据您要复制的位置来分配selinux上下文,而不是来自它的位置.运行restorecon会将上下文恢复为默认值并修复它.

  • 谢谢@jsina,这对我帮助很大 (2认同)
  • 妈的,*+1*,我也是。 (2认同)

And*_*ron 23

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


小智 11

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

sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/
Run Code Online (Sandbox Code Playgroud)

这将解决权限问题。